Рубрики
Без рубрики

Как удалить пустые строки из списка строк?

https://youtu.be/ntc1m40jltk Когда мысленно приближаются к этой проблеме, вы можете соблазнить использовать «для цикла». Я признаю, что это то, как мой разум работал: итерация через список один элемент за один раз и проверьте пустые строки. Если он пуст, удалите его. Повторить. Пожалуйста, присоединяйтесь ко мне в сегодняшней теме о том, как удалить пустые строки … Как удалить пустые строки из списка строк? Подробнее “

Автор оригинала: Peter Rubio.

Когда мысленно приближаются к этой проблеме, вы можете соблазнены использовать «для цикла». Я признаю, что это то, как мой разум работал: итерация через список один элемент за один раз и проверьте пустые строки. Если он пуст, удалите его. Повторить.

Пожалуйста, присоединяйтесь ко мне в сегодняшней теме о том, как удалить пустые строки из списка строк. Посмотрим, что произойдет, когда мы изменим список в цикле «За LOOP». Далее мы обсудим решение «пока цикла». И, наконец, мы пойдем на некоторые умные одноклассники Благодаря встроенным функциям Python.

Метод 1: для цикла

Что произойдет, если мы используем для цикла?

Как упоминалось ранее, мой первый инстинкт – это повторять петлю и проверять, будет ли строка на текущем индексе пустой. Следующий шаг – просто Удалить пустая строка. Некоторые варианты у нас в Python, это Удалить ( ) Метод – где вы указываете значение. Или POP () Метод – где вы указываете индекс.

При принятии решения о том, какой цикл использовать, мой инстинкт пошел прямо к «для петли».   Это связано с тем, что мы хотим повторить проверку пустой строки для каждого элемента во всей длине списка, который можно легко определить следующим образом:

>>> words = ["The", "", "quick", "", "brown", "", "fox", ""]
>>>
>>> for i in range(len(words)):
...     if words[i] == "":
...             words.pop(i)

Однако при запуске вышеуказанного кода мы получаем следующее сообщение:

''
''
''
''
Traceback (most recent call last):
  File "", line 2, in 
IndexError: list index out of range
>>> 

Так что на самом деле здесь происходит?   Оказывается, это не хорошая идея, чтобы удалить элементы из списка в «для петли», потому что индексы изменится!

Вот иллюстрация:

Индекс 0. Индекс 1. Индекс 2. Индекс 3. Индекс 4. Индекс 5. Индекс 6. Индекс 7.
“” “быстро” “” “коричневый” “” “лиса” “”

Осмотрите вышеуказанный список, мы видим, что нам нужно удалить индексы 1, 3, 5 и 7. Мы сможем имитировать наши «за петлю».

Первая итерация Я 0, слова [0] это " | Отказ   Это не равно "" Отказ Список без изменений.

Вторая итерация Я 1, слова [1] является “”. Это равно "" Итак, мы его удаляем. Вот модифицированный список:

Индекс 0. Индекс 1. Индекс 2. Индекс 3. Индекс 4. Индекс 5. Индекс 6.
“быстро” “” “коричневый” “” “лиса” “”

Третья итерация Я 2, слова [2] это "" Отказ   Это равно "" Итак, мы его удаляем. Вот модифицированный список:

Индекс 0. Индекс 1. Индекс 2. Индекс 3. Индекс 4. Индекс 5.
“быстро” “коричневый” “” “лиса” “”

Четвертая итерация Я 3, слова [3] это "" Итак, мы его удаляем. Вот модифицированный список:

Индекс 0. Индекс 1. Индекс 2. Индекс 3. Индекс 4.
“быстро” “коричневый” “лиса” “”

Пятая итерация Я 4, слова [4] это "" " Итак, мы его удаляем. Вот модифицированный список:

Индекс 0. Индекс 1. Индекс 2. Индекс 3.
“быстро” “коричневый” “лиса”

Мы уже видим, что мы удалили все пустые строки, однако, мы до сих пор не закончили итерацию по нашему определенному «для цикла», которые являются государствами, чтобы повторить длину списка слов, которые были изначально 8!

Шестая итерация 5, слова [5] не имеет диапазона, и мы получим сообщение об ошибке.

Вот еще одно изменение «для петли», где мы вместо этого используем способ удаления для удаления первого вхождения в списке.

>>> words = ["The", "", "", "quick", "", "", "brown", "", "fox", ""]
>>> for i in words:
...     if i == "":
...             words.remove(i)
...
>>> print(words)
['The', 'quick', 'brown', '', 'fox', '']
>>>

Как видно выше код выполняется без Ошибка индекса Отказ После завершения «для цикла» и печати результатов, мы можем увидеть слова Список все еще содержит две пустые строки.

Давайте пройдем каждую итерацию. Выделение будет представлять текущий итератор.

“” “” “быстро” “” “” “коричневый” “” “лиса” “”

1-я итерация Я это " | , это не равно "" Отказ Список без изменений, авансы итераторы.

2 итерация Я это "" Отказ

“” “” “быстро” “” “” “коричневый” “” “лиса” “”

Это равно "" Итак, мы называем функцию удаления. Обратите внимание, что следующая пустая строка находится на текущей версии итератора.

“” “быстро” “” “” “коричневый” “” “лиса” “”

Однако итератор должен продвинуться к следующему элементу.

“” “быстро” “” “” “коричневый” “” “лиса” “”

3 итерация Я это "Быстрый" , это не равно "" Отказ Список без изменений, авансы итераторы.

“” “быстро” “” “” “коричневый” “” “лиса” “”

4 итерация Я это "" Отказ   Это равно "" Итак, мы называем функцию удаления. Обратите внимание, что пустая строка в индексе 1 удаляется.   Это сдвигает следующую пустую строку к текущей версии итерации.

“быстро” “” “” “коричневый” “” “лиса” “”

Итератор достигает.

“быстро” “” “” “коричневый” “” “лиса” “”

5-я итерация Я это "Браун" , Это не равно "" Отказ Список без изменений, авансы итераторы.

“быстро” “” “” “коричневый” “” “лиса” “”

6 итерация Я это "" Итак, мы называем функцию удаления. Обратите внимание, что пустая строка в индексе 2 удаляется и заставляет текущий итератор быть "Фокс" Отказ

“быстро” “” “коричневый” “” “лиса” “”

Итератор достигает.

“быстро” “” “коричневый” “” “лиса” “”

Поскольку итератор сейчас находится в конце списка, это будет последнее сравнение.

Это равно "" Итак, мы называем функцию удаления. Примечание. Пустая строка при индексе 2 удаляется.

Окончательный список:

“быстро” “коричневый” “” “лиса” “”

Один обходной путь для использования «для петлей» – скопировать непустые строки в новый список. Вот пример:

>>> words = ["The", "", "", "quick", "", "", "brown", "", "fox", ""]
>>> new_words = []
>>> for i in words:
...     if i != "":
...             new_words.append(i)
...
>>> print(new_words)
['The', 'quick', 'brown', 'fox']
>>>

Прежде чем мы обсудим однонаторные решения, вот умный способ решить его, используя 2 строки с помощью «While Loop».

>>> words = ["The", "", "", "quick", "", "", "brown", "", "fox", ""]
>>> while "" in set(words):
...     words.remove("")
...
>>> print(words)
['The', 'quick', 'brown', 'fox']
>>>

Как написано выше, ключевое слово Python «In» используется для условия: до тех пор, пока есть пустая строка в списке слов, мы вызовем функцию удаления в списке. Как указано ранее, функция удаления удалит первое вхождение в списке.

Некоторые элегантные альтернативы

У вас есть PEEK на этих альтернативных решениях и посмотрим, сможете найти способы вписать их в свой код.   О, и если вы считаете себя опытным питонистом и стремились основывать свою кодирующую жизнь на Дзен Питона Тогда эти решения подойдут вам.   Как вы скоро увидите, что эти методы отлично выровняются с философией Python. Если вы еще не знакомы с Дзен Питона Tim Peters, то я приглашаю вас

>>> import this

Это выход:

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
>>>

Метод 2: Функция фильтра ()

Встроенный Python Фильтр Функция использует следующий формат: Фильтр (функция, утечка) Отказ

Для второго параметра – который должен быть истеренным – мы пройдем в нашу слова список. Мы можем использовать лямбда Функция Для первого параметра. Одно возможное определение лямбда состоит в том, чтобы указать строки, которые не пустые. (Я упомяну пару альтернатив позже.)

lambda x: x != ""

Примечание: согласно Python Docs Функция фильтра «строит итератор». Давайте рассмотрим результат, чтобы увидеть, что это значит.

>>> words = ["The", "", "quick", "", "brown", "", "fox", ""]
>>> print(filter(lambda x: x != "", words))

Приведенное выше показано, что содержимое отфильтрованного списка на самом деле не печатается, и мы остались с объектом фильтра. Для того, чтобы на самом деле увидеть результаты, нам нужно преобразовать его в объект списка.

>>> words = ["The", "", "quick", "", "brown", "", "fox", ""]
>>> print(list(filter(lambda x: x != "", words)))
['The', 'quick', 'brown', 'fox']
>>>

И если вышеуказанное выражение лямбда не было чем-то, что вы инстинктивно думали или не так элегантны, как вы хотели бы, то, возможно, эти другие решения пополняют ваш переулок.

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

lambda x: len(x)
>>> words = ["The", "", "quick", "", "brown", "", "fox", ""]
>>> print(list(filter(lambda x: len(x), words)))
['The', 'quick', 'brown', 'fox']
>>>

Пока строка имеет длину, она останется в списке. В противном случае это считается пустой строкой и отфильтровывается.

Возможно, это последний – самый элегантный, но я оставлю его с вами, чтобы решить. Обратите внимание, что мы заменим функцию с помощью Ключевое слово Python Нет Отказ

>>> words = ["The", "", "quick", "", "brown", "", "fox", ""]
>>> print(list(filter(None, words)))
['The', 'quick', 'brown', 'fox']
>>>

Ссылаясь на Python Docs : «Если функция отсутствует, предполагается, что функция идентичности предполагается, то есть все элементы, которые являются неверными, которые являются ложными, удалены . ” Поэтому пустая строка считается ложным в Python и будет отфильтроваться.

Способ 3: Понимание списка

Другой Python One-liLer, который я приглашаю, чтобы исследовать это Список понимания . От Python Docs. : «Понимание списка состоит из скобок, содержащих выражение, сопровождаемое предложение для предложения, то ноль или более для или если положения« » Отказ

Применим это в наш список строк и проверьте понимание списка, которое я определен ниже.

[i for i in words if i != ""]

Я проиграет через слова список. Пока это не пустая строка, то он будет добавлен в новый список, называемый new_words Отказ Мы просто назначаем понимание списка в переменной.

Вот полный фрагмент кода.

>>> words = ["The", "", "quick", "", "brown", "", "fox", ""]
>>> new_words = [i for i in words if i != ""]
>>> print(new_words)
['The', 'quick', 'brown', 'fox']
>>>

Альтернатива для приведенного выше заявления о том, чтобы проверить что Я имеет длину.

>>> words = ["The", "", "quick", "", "brown", "", "fox", ""]
>>> new_words = [i for i in words if len(i)]
>>> print(new_words)
['The', 'quick', 'brown', 'fox']
>>>

И вот как мы удаляем пустые строки со списком пониманием.

Резюме

Я, безусловно, надеюсь, вам понравилось читать о некоторых однострочных решениях Python One-Line для удаления пустых строк из списка строк. Мы исследовали функцию фильтра – имейте в виду, что он вернет объект фильтра, поэтому, когда вы работаете со списком, обязательно преобразоруйте отфильтрованный результат обратно в список. И другой подход, на котором мы смотрели, было с решением понимания списка Python. Одинаково чистый и умный. Я оставлю его с вами, чтобы решить, какой метод вы предпочитаете использовать в вашем следующем проекте кодирования – возможно, использовать оба!

Кроме того, я надеюсь, что вы сейчас полностью осознаете, что происходит при использовании «для цикла» для удаления элементов в списке. Как объяснено выше, вам может побазвать и получить индексную ошибку.   Но будьте осторожны с другими ситуациями, когда вы не получаете ошибку, и ваш код все еще выполняется. В нашем примере «За LOOP» завершено и оставили две пустые строки в списке!

Наконец, я хотел бы побудить вас читать через Дзен Питона Если вы еще этого не сделали. Пусть он будет служить дополнительным вдохновением для кодирования Python Way.   И прежде чем узнать это, вы скоро узнаете, что создаете красивый код.

Оригинал: “https://blog.finxter.com/how-to-remove-empty-strings-from-a-list-of-strings-check-out-these-3-python-methods/”