Как проверить, пустой ли список?
Проблема: Как проверить, пустой ли список в Python?
У меня есть список в Python, который я определил следующим образом:
a = []
Теперь я хочу выяснить, пустой ли этот список. Как правильно это сделать?
Какие есть подходы и какие из них лучше использовать с точки зрения производительности и читабельности кода?
5 ответ(ов)
Я предпочитаю явный вариант:
if len(li) == 0:
print('список пуст')
Таким образом, абсолютно ясно, что li
является последовательностью (списком) и мы хотим проверить его размер. Моя проблема с if not li: ...
заключается в том, что это создает ложное впечатление, что li
— это булевая переменная.
Зачем проверять вообще?
Перед тем как проверять, пустой ли список, стоит задуматься, действительно ли это необходимо. В идиоматичном подходе Python часто избегают явных проверок в пользу того, чтобы позволить языку естественным образом обрабатывать такие случаи.
Например:
a = []
for item in a:
# <Делать что-то с item>
# <Остальная часть кода>
Если a пуст, то тело цикла просто не выполнится, и программа продолжит работать без сбоев. Этот подход обычно является самым простым и "питоничным" способом работы со списками, независимо от их содержимого.
Тем не менее, если вам ТЯСНО нужно проверить пустой ли список (например, чтобы обработать его иначе):
a = []
if not a:
# <Реагировать на пустой список>
# <Остальная часть кода>
это вполне достаточно, как уже предложили другие.
Я написал следующий код:
if isinstance(a, (list, some, other, types, i, accept)) and not a:
do_stuff
но он был оценен на -1. Я не уверен, связано ли это с тем, что читатели не согласны с такой логикой, или же они посчитали, что ответ не был представлен в удачной форме. Будем считать, что это второе, так как, как бы мы ни определяли "питоничность", данная стратегия верная. Если вы еще не исключили случаи, когда a
может быть, например, False
, вам нужен более строгий тест, чем просто if not a:
. Можно использовать что-то вроде этого:
if isinstance(a, numpy.ndarray) and not a.size:
do_stuff
elif isinstance(a, collections.Sized) and not a:
do_stuff
Первый тест является ответом на комментарий @Mike, приведенный выше. Третью строку также можно заменить на:
elif isinstance(a, (list, tuple)) and not a:
если вы хотите принимать только экземпляры определенных типов (и их подтипов) или на:
elif isinstance(a, (list, tuple)) and not len(a):
Вы можете обойтись без явной проверки типа, но только если окружающий контекст уже гарантирует, что a
— это значение тех типов, которые вы готовы обрабатывать, или если вы уверены, что типы, которые вы не готовы обрабатывать, вызовут ошибки (например, TypeError
, если вы вызовете len
для значения, для которого это неопределено) — и вы готовы справляться с этими ошибками. В общем, "питоничные" соглашения склоняются к последнему подходу. Обрабатывайте объект как утку и позволяйте ему вызывать DuckError, если он не знает, как квака́ть. Тем не менее, вам все равно нужно подумать о типах, которые вы предполагаете, и убедиться, что случаи, с которыми вы не готовы справляться, действительно вызовут ошибки в нужных местах. Массивы Numpy — хороший пример ситуации, когда просто слепо полагаться на len
или булевое приведение может не дать того результата, которого вы ожидаете.
Вот несколько способов проверить, пустой ли список:
a = [] # это список
1) Простой и питоничный способ:
if not a:
print("a пустой")
В Python пустые контейнеры, такие как списки, кортежи, множества, словари и переменные, рассматриваются как False
. Вы можете просто считать список предикатом (возвращающим булево значение), где значение True
будет означать, что он непустой.
2) Более явный способ: используя len()
, чтобы узнать длину и проверить, равна ли она 0
:
if len(a) == 0:
print("a пустой")
3) Или сравнив его с анонимным пустым списком:
if a == []:
print("a пустой")
4) Еще один, пусть и глупый способ, заключается в использовании исключения и функции iter()
:
try:
next(iter(a))
# список имеет элементы
except StopIteration:
print("Ошибка: a пустой")
Выберите любой из приведенных методов в зависимости от ваших предпочтений и стиля кода!
Вы можете проверить, является ли список пустым, используя следующее выражение в Python:
if a == []:
print("Список пустой.")
Однако, более предпочтительным способом проверки на пустоту списка в Python является использование простого выражения:
if not a:
print("Список пустой.")
Это более "питонично" и считается хорошей практикой.
Почему используется string.join(list), а не list.join(string)?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Как вернуть ключи словаря в виде списка в Python?
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Как преобразовать строковое представление списка в список?