Вопрос-Ответ

How do I check if a list is empty?

Как мне проверить, пуст ли список?

Например, если передано следующее:

a = []

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

Переведено автоматически
Ответ 1
if not a:
print("List is empty")

Использование неявной логичности пустого list файла вполне по-питоновски.

Ответ 2

Pythonic способ сделать это взят из руководства по стилю PEP 8.


Для последовательностей (строк, списков, кортежей) используйте тот факт, что пустые последовательности имеют значение false:


# Correct:
if not seq:
if seq:

# Wrong:
if len(seq):
if not len(seq):

Ответ 3

Я предпочитаю использовать это явно:

if len(li) == 0:
print('the list is empty')

Таким образом, на 100% ясно, что li это последовательность (список), и мы хотим проверить ее размер. Моя проблема с if not li: ... заключается в том, что создается ложное впечатление, что li это логическая переменная.

Ответ 4

Это первое попадание в Google по запросу "python test empty array" и подобным запросам, и другие люди обобщают вопрос, выходя за рамки просто списков, поэтому вот предостережение для другого типа последовательности, который используют многие люди.

Другие методы не работают для массивов NumPy

Вам нужно быть осторожным с массивами NumPy, потому что другие методы, которые отлично работают для lists или других стандартных контейнеров, не работают с массивами NumPy. Я объясняю почему ниже, но вкратце, предпочтительный метод - использовать size.

"Питонический" способ не работает: часть 1

"Питонический" способ не работает с массивами NumPy, потому что NumPy пытается преобразовать массив в массив из bools и if x пытается оценить все эти bool s сразу для получения некоторого совокупного истинностного значения. Но это не имеет никакого смысла, поэтому вы получаете ValueError:

>>> x = numpy.array([0,1])
>>> if x: print("x")
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

"Питонический" способ не работает: часть 2

Но, по крайней мере, приведенный выше пример говорит вам, что это не удалось. Если у вас есть массив NumPy, содержащий ровно один элемент, оператор if будет "работать" в том смысле, что вы не получите ошибку. Однако, если этот один элемент окажется 0 (или 0.0, или False, ...), if оператор неправильно приведет к False:

>>> x = numpy.array([0,])
>>> if x: print("x")
... else: print("No x")
No x

Но очевидно, что x существует и не является пустым! Этот результат не тот, который вы хотели.

Использование len может дать неожиданные результаты

Например,

len( numpy.zeros((1,0)) )

возвращает 1, даже если в массиве нет элементов.

Способ numpythonic

Как объясняется в часто задаваемых вопросах по SciPy, правильным методом во всех случаях, когда вы знаете, что у вас есть массив NumPy, является использование if x.size:

>>> x = numpy.array([0,1])
>>> if x.size: print("x")
x

>>> x = numpy.array([0,])
>>> if x.size: print("x")
... else: print("No x")
x

>>> x = numpy.zeros((1,0))
>>> if x.size: print("x")
... else: print("No x")
No x

Если вы не уверены, может ли это быть a list, массив NumPy или что-то еще, вы могли бы объединить этот подход с ответом @dubiousjim, который дает чтобы убедиться, что для каждого типа используется правильный тест. Не очень "питонистский", но оказывается, что NumPy намеренно нарушил питонистичность, по крайней мере, в этом смысле.

Если вам нужно сделать больше, чем просто проверить, пусты ли входные данные, и вы используете другие функции NumPy, такие как индексирование или математические операции, вероятно, более эффективно (и, конечно, более распространено) заставить входные данные быть массивом NumPy. Есть несколько приятных функций для быстрого выполнения этого — наиболее важных numpy.asarray. Это принимает ваш ввод, ничего не делает, если это уже массив, или оборачивает ваш ввод в массив, если это список, кортеж и т.д., и при необходимости преобразует его в выбранный вами dtype. Таким образом, это происходит очень быстро, когда это возможно, и гарантирует, что вы просто предположите, что входные данные представляют собой массив NumPy. Обычно мы даже просто используем одно и то же имя, поскольку преобразование в массив не вернет его за пределы текущей области:

x = numpy.asarray(x, dtype=numpy.double)

Это заставит x.size проверку работать во всех случаях, которые я вижу на этой странице.

python list