2017-02-18 13 views
3

Если у меня есть список Python:Python удаления из списка элементов

text = ["the", "red", "", "", "fox", "", "is"] 

Как я могу использовать itertools (или другим способом), чтобы изменить список текста таким образом, что он проверяет elem и elem+1 и если он находит приравнивает к "" , то он удаляет их из списка. Я хочу, чтобы список был изменен, если найдено elem + elemt1 (поэтому часть ["fox" "", "is"] остается в списке). Заказ элементов списка должен оставаться неповрежденным.

text = ["the", "red", "fox", "", "is"] 
+0

так что вы хотите удалить нулевые значения с «» из список? –

+2

Что относительно '[" "," red "," "," "," "," fox "," "," is "]'? Должны ли все три пустые строки удаляться или вы держите один из них? – Psidom

ответ

2
from itertools import groupby, chain 

print list(chain(*[ 
    l for l in [list(it) for _, it in groupby(text)] if l[:2] != ['', ''] 
])) 

Результат:

['the', 'red', 'fox', '', 'is'] 

С groupby мы можем же последовательные элементы, как списки. Затем мы проверяем каждый список, если он имеет длину больше двух, а все элементы - пустая строка. Затем мы сохраняем то, что хотим, и сглаживаем списки, используя chain.

+0

use 'zip_longest' – Daniel

+0

Этот результат не похож на желаемый результат в вопросе. – schwobaseggl

+0

Вы правы. Я обновил свой ответ – JuniorCompressor

-3
for t in text: 
    if not t: 
    text.remove(t) 
+1

никогда не изменяйте список, который вы повторяете. – Daniel

2

Вы можете использовать itertools.groupby:

import itertools 

new = [] 
for item, group in itertools.groupby(text): 
    group = list(group) 
    if item != '' or len(group) == 1: 
     new.extend(group) 

>>> new 
['the', 'red', 'fox', '', 'is'] 

Или немного более эффективным с groupby -функции. Можно использовать тот факт, что пустые строки считаются False при литье в bool:

import itertools 

new = [] 
for item, group in itertools.groupby(text, bool): 
    group = list(group) 
    if item or len(group) == 1: 
     new.extend(group) 

>>> new 
['the', 'red', 'fox', '', 'is'] 
+0

Это та же логика, что и мое решение, но более читаемая и, таким образом, поучительная;) – schwobaseggl

0

это работа с более чем 2 белых пространств также

text = ["the", "red", "","", "", "fox", "", "is"] 
new_text = [] 

text_len = len(text); 
print(text_len) 
i = 0; 
while(i < text_len): 
    if (text[i] == "" and text[i + 1] == ""): 
     i += 1; 
     while(True): 
       if (text[i] == "" and text[i + 1] == ""): 
        i+=1; 
       else: 
         break; 

    else : 
     new_text.append(text[i]); 
    i += 1; 
print(new_text)