2016-11-23 3 views
-1

Я знаю, что это довольно тривиальный вопрос, но именно поэтому я тоже думал, когда пытался его решить. Тем не менее, я здесь и задаю этот вопрос. Это должно быть очень легко и, вероятно, я делаю что-то совершенно неправильное, но я хотел бы знать, что я делаю неправильно.Почему я не могу удалить пустую строку в этом списке?

У меня есть этот список строк:

['1', ' ', '2', ' ', '6', ' ', '6', ' ', '5', ' ', '6', ' ', '5'] 

Я раздел/п уже делая это:

rstrip("\n") 

А теперь, я хочу, чтобы избавиться от пустых строк, поэтому я попытался использовать filter(None,x), но это не работает. Кроме того, попытался удалить его с помощью for loop; тоже не работает.

filter(None, the_list) 

Что не так с этим утверждением? Я также попробовал эту упаковку в list(), но не работал.

попытался Также это:

my_list = [str for str in the_list if str] 

ли я что-то отсутствует?

PS: моя конечная цель - преобразовать строки в int, чтобы я мог рассчитать материал, но я могу только это, если я избавлюсь от пустых строк.

+4

Ваши строки не являются пустыми. Они содержат пробел каждый. –

+0

ваши строки имеют промежутки между ними, удалите их и попробуйте еще раз. –

+0

Это не работает @Chris_Rands. Спасибо за информацию ребята, я не знаю, почему это занижено, но я просто новобранец, который не видел очевидной части. Извините за это, просто пытаясь учиться. – Siyah

ответ

6

У вас нет пустых строк. У вас есть строки с одним пробелом в каждом.

Вы можете удалить те, проверяя, если они пусты после зачистки:

my_list = [el for el in the_list if el.strip()] 

Однако, вы можете изучить, как вы получили этот список в первую очередь. Возможно, вы можете удалить эти пробелы раньше или использовать str.split() без аргумента, чтобы разделить на произвольную ширину пробелов, а не на строку с фиксированной шириной.

+0

Я соглашусь с этим ответом, потому что вы указали мне в правильном направлении, сказав, что я должен был бы лишить пространства в первую очередь. Теперь я знаю, что я сделал не так! Спасибо, Мартийн! – Siyah

+0

Любая заметная разница между использованием 'if el.strip()' vs 'if not el.isspace()' или только предпочтение стиля? –

+1

@Chris_Rands: 'el.strip()' должен возвращать новый строковый объект, 'el.isspace()' только логический. Поскольку я обычно обрабатываю строки до этого момента, я не думал о 'el.isspace()'. Однако для текста ASCII 'el.strip()' оптимизируется, поэтому для одного пространства разница действительно очень мала (возможно, разница в скорости 10-20%, но это будет заметно только при 100 млн повторений, поскольку оба так что очень быстро. –

8

У вас нет пустых строк, кроме строк, содержащих пробелы. Вы можете использовать str.isspace, чтобы отфильтровать нежелательные строки:

s = ['1', ' ', '2', ' ', '6', ' ', '6', ' ', '5', ' ', '6', ' ', '5'] 

r = [i for i in s if not i.isspace()] 
print(r) 
# ['1', '2', '6', '6', '5', '6', '5'] 
4

Это строки не пусто, есть пробелы в нем. Использование полосы()

[str for str in l if str.strip()] 
1

Я предполагаю, что они не являются пустыми строками, но пробела

l = [x for x in l if x.strip()] 
0

filter(None, my_list) удалить только пустой элемент, но ваша деталь содержит пространство, которое не является пустым. Попробуйте ниже

my_list = ['1', ' ', '2', ' ', '6', ' ', '6', ' ', '5', ' ', '6', ' ', '5'] 
my_list = filter(lambda x:x.strip(), my_list) 
# ['1', '2', '6', '6', '5', '6', '5'] 
2

Строка, содержащая пространство, не является пустой строкой.Вы можете удалить эти строки, которые содержат только пространство по:

[si for si in sl if si.strip()] 
+1

Добавьте к вам новую новинку. Это точная копия (в настоящее время) трех других ответов. – gustafbstrom

0

Попробуйте это:

while ' ' in my_list: 
    my_list.remove(' ') 

filter не будет работать, потому что ' ' не является пустым, то есть не None.

+1

Спасибо! @gustafbstrom –

0
for num in range(len(my_list)): 
    if my_list[num] == " ": 
     try: 
      my_list.pop(num) 
     except IndexError: 
      pass 

не очень эффективным, но работает AHA