Как проверить, пуст ли список?
например, если передано следующее:
a = []
Как проверить, если a
пусто?
27 ответов:
if not a: print("List is empty")
С помощью неявного booleanness пустой список вполне подходящие для Python.
в подходящие для Python способ сделать это с руководство по стилю PEP 8 (где да означает "рекомендовано" и нет означает "не рекомендуется"):
для последовательностей (строк, списков, кортежей), используем тот факт, что пустые последовательности являются ложными.
Yes: if not seq: if seq: No: if len(seq): if not len(seq):
Я предпочитаю это явно:
if len(li) == 0: print('the list is empty')
таким образом, это 100% ясно, что
li
- это последовательность (список) и мы хотим проверить его размер. Моя проблема сif not li: ...
это дает ложное впечатление, чтоli
- логическая переменная.
другие люди, похоже, обобщают вопрос за пределами просто списков, поэтому я подумал, что добавлю предостережение для другого типа последовательности, которую могут использовать многие люди, тем более, что это первый хит google для "python test empty array".
другие методы не работают для массивов numpy
вы должны быть осторожны с массивами numpy, потому что другие методы, которые работают нормально для
list
S или другие стандартные контейнеры не для массивов numpy. Я объясните, почему ниже, но вкратце,предпочтительный способ использоватьsize
."питонический" способ не работает: Часть 1
"питонический" способ не работает с массивами numpy, потому что numpy пытается привести массив к массиву
bool
S и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 FAQ правильный метод во всех случаях, когда вы знаете, у вас есть массив 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
если вы не уверены, может ли это быть
list
, массив numpy, или что-то еще, вы можете объединить этот подход с ответ @dubiousjim дает чтобы убедиться, что правильный тест используется для каждого типа. Не очень "питонический", но оказывается, что numpy намеренно нарушил питонизм, по крайней мере, в этом смысле.Если вам нужно сделать больше, чем просто проверить, пуст ли вход, и вы используете другие функции numpy, такие как индексация или математические операции, это, вероятно, более эффективно (и, конечно, более распространено), чтобы заставить вход на a массив numpy. Есть несколько хороших функций для этого быстро - самое главное
numpy.asarray
. Это принимает ваш вход, ничего не делает, если это уже массив, или обертывает ваш вход в массив, если это список, кортеж и т. д., и дополнительно преобразует его в выбранныйdtype
. Поэтому это очень быстро, когда это возможно, и это гарантирует, что вы просто предположите, что вход является массивом numpy. Мы обычно даже просто используем одно и то же имя, так как преобразование в массив не вернет его вне текущего scope:x = numpy.asarray(x, dtype=numpy.double)
это
x.size
проверьте работу во всех случаях, которые я вижу на этой странице.
пустой список сам по себе считается ложным в тестировании истинного значения (см. документация python):
a = [] if a: print "not empty"
@Daren Thomas
EDIT: еще один пункт против тестирования пустой список как ложные: а полиморфизм? Вы не должны зависеть от список есть список. Он должен просто крякать, как утка - как дела чтобы получить вашу утиную коллекцию крякать "Ложь", когда в ней нет элементов?
ваш duckCollection должен реализовать
__nonzero__
или__len__
Так что если a: будет работать без проблем.
лучший способ проверить, если список пуст
например, если передано следующее:
a = []
как я могу проверить, чтобы увидеть, если пусто?
Короткий Ответ:
поместите список в логический контекст (например, с
if
илиwhile
заявления). Это будет тестFalse
если он пуст, иTrue
в противном случае. Например:if not a: # do this! print('a is an empty list')
обращение к Власть
PEP 8, официальное руководство по стилю Python для кода Python в стандартной библиотеке Python, утверждает:
для последовательностей (строк, списков, кортежей), используем тот факт, что пустые последовательности являются ложными.
Yes: if not seq: if seq: No: if len(seq): if not len(seq):
мы должны ожидать, что стандартный код библиотеки должен быть максимально эффективным и правильным. Но почему это так, и зачем нам это надо руководство?
объяснение
я часто вижу такой код от опытных программистов, новых для Python:
if len(a) == 0: # Don't do this! print('a is an empty list')
и у пользователей ленивых языков может возникнуть соблазн сделать это:
if a == []: # Don't do this! print('a is an empty list')
они верны в своих соответствующих других языках. И это даже семантически правильно в Python.
но мы считаем, что это ООН-подходящие для Python, потому что Python поддерживает эту семантику непосредственно в интерфейсе списка объектов с помощью булевых принуждение.
с docs (и обратите особое внимание на включение пустого списка,
[]
):по умолчанию, объект считается истинным, если его класс определяет либо
__bool__()
метод, который возвращаетFalse
или__len__()
способ это возвращает ноль, когда вызывается с объектом. Вот большинство встроенных объектов, которые считаются ложными:
- константы, определенные как false:
None
иFalse
.- ноль любого числового типа:
0
,0.0
,0j
,Decimal(0)
,Fraction(0, 1)
- пустые последовательности и коллекций:
''
,()
,[]
,{}
,set()
,range(0)
и документация datamodel:
вызывается для реализации тестирования истинностного значения и встроенной операции
bool()
; должен возвратитьFalse
илиTrue
. Если этот метод не определен,__len__()
называется, если он определен, и объект считается истинным, если его результат равен нулю. Если класс не определяет ни__len__()
ни__bool__()
, все его экземпляры считаются истинными.и
вызывается для реализации встроенной функции
len()
. Должна возвращать длину объекта, целое число >= 0. Кроме того, объект, который не определить__bool__()
метод и чей__len__()
метод возвращает ноль считается false в логическом контексте.так вместо этого:
if len(a) == 0: # Don't do this! print('a is an empty list')
или такой:
if a == []: # Don't do this! print('a is an empty list')
этого:
if not a: print('a is an empty list')
делать то, что питон обычно окупается в производительности:
окупается ли это? (Обратите внимание, что меньше времени для выполнения эквивалентной операции лучше:)
>>> import timeit >>> min(timeit.repeat(lambda: len([]) == 0, repeat=100)) 0.13775854044661884 >>> min(timeit.repeat(lambda: [] == [], repeat=100)) 0.0984637276455409 >>> min(timeit.repeat(lambda: not [], repeat=100)) 0.07878462291455435
для масштаба, вот стоимость вызова функция и построение и возврат пустого списка, который вы можете вычесть из стоимости проверок пустоты, используемых выше:
>>> min(timeit.repeat(lambda: [], repeat=100)) 0.07074015751817342
мы видим, что или проверка длины с помощью встроенной функции
len
по сравнению с0
или проверка по пустому списку много менее эффективен, чем использование встроенного синтаксиса языка, как описано в документе.почему?
на
len(a) == 0
проверьте:сначала Python должен проверить глобалы, чтобы увидеть, если
len
затенен.тогда он должен вызвать функцию load
0
, и сделать сравнение равенства в Python (вместо С C):>>> import dis >>> dis.dis(lambda: len([]) == 0) 1 0 LOAD_GLOBAL 0 (len) 2 BUILD_LIST 0 4 CALL_FUNCTION 1 6 LOAD_CONST 1 (0) 8 COMPARE_OP 2 (==) 10 RETURN_VALUE
и
[] == []
он должен построить ненужный список, а затем снова выполнить операцию сравнения в виртуальной машине Python (в отличие от C)>>> dis.dis(lambda: [] == []) 1 0 BUILD_LIST 0 2 BUILD_LIST 0 4 COMPARE_OP 2 (==) 6 RETURN_VALUE
"Питонический" способ является гораздо проще и быстрее проверить, так как длина списка кэшируется в заголовке объекта:
>>> dis.dis(lambda: not []) 1 0 BUILD_LIST 0 2 UNARY_NOT 4 RETURN_VALUE
доказательства из источника C и документации
это
PyObject
добавляет
ответ Патрика (принят) правильно:
if not a:
- Это правильный способ сделать это. ответ Харли Холкомба правильно, что это в руководстве по стилю PEP 8. Но ни один из ответов не объясняет, почему это хорошая идея следовать идиоме-даже если вы лично считаете, что она недостаточно ясна или запутана для пользователей Ruby или что-то еще.код Python и сообщество Python имеют очень сильные идиомы. После этих идиом делает ваш код легче читать для тех, кто имеет опыт работы в Python. И когда вы нарушаете эти идиомы, это сильный сигнал.
это правда
if not a:
не отличает пустые списки отNone
, или числовой 0, или пустые кортежи, или пустые созданные пользователем типы коллекций, или пустые созданные пользователем не совсем типы коллекций, или одноэлементный массив NumPy, действующий как скаляры с ложными значениями и т. д. И иногда важно быть откровенным об этом. И в таком случае, вы знаете что вы хотите быть ясно, так что вы можете проверить именно это. Например,if not a and a is not None:
означает "что-нибудь фальшивое, кроме None", в то время какif len(a) != 0:
означает "только пустые последовательности-и все, кроме последовательности, является ошибкой здесь", и так далее. Помимо тестирования именно того, что вы хотите проверить, это также сигнализирует читателю, что этот тест важен.но когда у вас нет ничего, чтобы быть явным, ничего, кроме
if not a:
вводит читателя в заблуждение. Вы сигнализируете о чем-то столь же важном, когда (вы также можете сделать код менее гибким, или медленнее, или что-то еще, но это все менее важно.) А если ты обычно ввести читателя в заблуждение, как это, тогда, когда вы do нужно сделать различие, это пройдет незамеченным, потому что вы были "Плачущий Волк" на всем протяжении вашего кода.
зачем вообще проверять?
никто, кажется, не обратился к допросу вашего нужно чтобы проверить этот список в первую очередь. Поскольку вы не предоставили никакого дополнительного контекста, я могу себе представить, что вам, возможно, не нужно делать эту проверку в первую очередь, но вы не знакомы с обработкой списка в Python.
Я бы сказал, что наиболее подходящие для Python способ заключается в том, чтобы не проверять вообще, а просто обрабатывать список. Таким образом, он будет делать правильные вещи будь то пустой или полный.
a = [] for item in a: <do something with item> <rest of code>
это имеет преимущество обработки любого содержимого a, не требуя при этом особой проверки на пустоту. Если a пусто, зависимый блок не будет выполняться, и интерпретатор перейдет к следующей строке.
Если вам действительно нужно проверить массив на пустоту, других ответов достаточно.
len()
операция O(1) для списков Python, строк, диктов и наборов. Python внутренне отслеживает количество элементов в этих контейнерах.JavaScript имеет аналогичное понятие истинности / ложности.
Я написал:
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
первый тест в ответ на ответ @Майк, выше. Третья строка также может быть заменена на:
elif isinstance(a, (list, tuple)) and not a:
если вы хотите принимать только экземпляры определенных типов (и их подтипов), или с:
elif isinstance(a, (list, tuple)) and not len(a):
вы можете уйти без явной проверки типа, но только если окружающий контекст уже гарантирует вам, что
a
- это значение типов, которые вы готовы обрабатывать, или если вы уверены, что типы, которые вы не подготовленные к обработке будут вызывать ошибки (например, aTypeError
если вы называетеlen
на значение, для которого оно не определено), которое вы готовы обрабатывать. В общем, "весть" конвенций, кажется, идут это последний способ. Сожмите его, как утку, и пусть он поднимет утку, если он не знает, как крякать. Вы все еще должны думаю о том, какие предположения типа Вы делаете, хотя, и являются ли случаи, которые вы не готовы обрабатывать должным образом действительно будет ошибка в нужное место. Массивы Numpy являются хорошим примером, где просто слепо полагаясь наlen
или boolean typecast может не делать именно то, что вы ожидаете.
Python очень однороден в отношении обработки пустоты. Учитывая следующее:
a = [] . . . if a: print("List is not empty.") else: print("List is empty.")
вы просто проверяете список a с помощью оператора "if", чтобы увидеть, пуст ли он. Из того, что я читал и чему меня учили, это "Питонический" способ увидеть, пуст ли список или кортеж.
некоторые методы, которые я использую:
if not a: print "list is empty" if len(a) == 0: print "list is empty"
С документация на тестировании истинностного значения:
все значения, кроме перечисленных здесь, считаются
True
None
False
- ноль любого числового типа, например,
0
,0.0
,0j
.- любая пустая последовательность, например,
''
,()
,[]
.- любое пустое отображение, например,
{}
.- экземпляры определяемые пользователем классы, если класс определяет
__bool__()
или__len__()
метод, когда этот метод возвращает целое число ноль или bool значениеFalse
.как видно, пустой список
[]
и ложь, поэтому делать то, что было бы сделано для логического значения, звучит наиболее эффективно:if not a: print('"a" is empty!')
вот несколько способов, вы можете проверить, если список пуст:
a = [] #the list
1) довольно простой для Python образом:
if not a: print("a is empty")
В Python, пустые контейнеры таких как списки,кортежи,множества,предсказывает,переменные и т. д. видел как
False
. Можно просто рассматривать список как предикат ( возвращает логическое значение). ИTrue
значение будет означать, что он непустой.2) очень явные способ: с помощью
len()
чтобы найти длину и проверить, если она равна0
:if len(a) == 0: print("a is empty")
3) или сравнивая его с анонимным пустым списком:
if a == []: print("a is empty")
4) еще глупо способ сделать это с помощью
exception
иiter()
:try: next(iter(a)) # list has elements except StopIteration: print("Error: a is empty")
Я предпочитаю следующее:
if a == []: print "The list is empty."
читаем и вам не придется беспокоиться о вызове функции, как
len()
для перебора переменных. Хотя я не совсем уверен, что такое обозначение BigO чего-то вроде этого... но Python настолько невероятно быстр, что я сомневаюсь, что это будет иметь значение, еслиa
гигантская.
def list_test (L): if L is None : print 'list is None' elif not L : print 'list is empty' else: print 'list has %d elements' % len(L) list_test(None) list_test([]) list_test([1,2,3])
это иногда хорошо, чтобы проверить
None
и для пустоты отдельно, так как это два разных состояния. Приведенный выше код выдает следующий результат:list is None list is empty list has 3 elements
хотя это ничего не стоит, что
None
- это ложь. Так что если вы не хотите, чтобы тест дляNone
-Несс, ты не должна этого делать.def list_test2 (L): if not L : print 'list is empty' else: print 'list has %d elements' % len(L) list_test2(None) list_test2([]) list_test2([1,2,3])
производит ожидаемого
list is empty list is empty list has 3 elements
вы даже можете попробовать использовать bool () вот так
a = [1,2,3]; print bool(a); # it will return True a = []; print bool(a); # it will return False
Я люблю этот способ для проверки списка пуст или нет.
очень удобно и полезно.
вдохновляясь решением @dubiousjim, я предлагаю использовать дополнительную общую проверку того, является ли это чем-то итерируемым
import collections def is_empty(a): return not a and isinstance(a, collections.Iterable)
Примечание: строка считается итерационной. - добавить
and not isinstance(a,(str,unicode))
Если вы хотите, чтобы пустая строка была исключенатест:
>>> is_empty('sss') False >>> is_empty(555) False >>> is_empty(0) False >>> is_empty('') True >>> is_empty([3]) False >>> is_empty([]) True >>> is_empty({}) True >>> is_empty(()) True
если вы хотите проверить, если список пуст;
l = [] if l: # do your stuff.
если вы хотите, чтобы проверить погоду, все значения в списке пусто.
l = ["", False, 0, '', [], {}, ()] if all(bool(x) for x in l): # do your stuff.
однако это будет верно для пустого списка.
def empty_list(lst): if len(lst) ==0: return false else: return all(bool(x) for x in l)
теперь вы можете использовать:
if empty_list(lst): # do your stuff.
просто используйте is_empty () или сделать функцию, как:-
def is_empty(any_structure): if any_structure: print('Structure is not empty.') return True else: print('Structure is empty.') return False
Он может быть использован для любой data_structure как список,кортежи, словарь и многое другое. По этим, вы можете назвать его много раз, используя только
is_empty(any_structure)
.
посмотрите на следующий код, выполненный на интерактивном терминале Python.
>>> a = [] >>> if a: ... print "List is not empty"; ... else: ... print "List is empty" ... List is empty >>> >>> a = [1, 4, 9] >>> if a: ... print "List is not empty"; ... else: ... print "List is empty" ... List is not empty >>>