Как проверить, содержит ли список пустые элементы?
Предположим, у меня есть пустая строка, она будет разделена:
>>>''.split(',')
['']
результат разделения ['']
. Я использую bool
чтобы проверить, является ли он пустым. Он вернется True
.
>>>bool([''])
True
Как проверить, что результат разделения пуст?
5 ответов
С bool([''])
вы проверяете, если список ['']
имеет какое-либо содержание, что это значит, содержимое просто оказывается пустой строкой ''
.
если вы хотите проверить, является ли все элементы в списке не являются "пустыми" (поэтому, если список содержит строку ''
вернет False
) вы можете использовать встроенную функцию all()
:
all(v for v in l)
это занимает каждый элемент v
in список l
и проверяет, есть ли у него True
значение; если все элементы do it returns True
если хотя бы один не возвращается False
. В качестве примера:
l = ''.split(',')
all(v for v in l)
Out[75]: False
вы можете заменить это с any()
выполнить частичную проверку и посмотреть, если любой из элементов в списке l
имеет значение True
.
более полный пример* с обоими использует:
l = [1, 2, 3, '']
all(l)
# '' doesn't have a True value
Out[82]: False
# 1, 2, 3 have a True value
any(l)
Out[83]: True
* As @ShadowRanger указано в комментариях, то же самое можно сделать с all(l)
или any(l)
так как они оба просто принимают iterable в конце.
если пустота является важным результатом, вероятно, лучше сначала проверить исходную строку:
x = ''
if x:
# Original string was non-empty, split it
splitx = x.split(',')
if any(splitx):
# There was at least one character in the original string that wasn't a comma
первый тест исключает пустые начальные строки, второй использует any
исключает строки, которые были не чем иным, как разделенным символом, и поэтому возвращает целую кучу пустых строк, но не непустых строк. Пока у вас есть одна непустая строка, она проходит.
Примечание: Если вы пытаетесь проанализировать CSV-файлы, не используйте .split(',')
есть csv
модуль который обрабатывает это правильно (включая побеги, цитирование и т. д.), и должен всегда используется для синтаксического анализа CSV, никогда не сверните свой собственный парсер. Добавлен бонус:csv
преобразует ''
входы []
строки, которые вы можете проверить на правдивость напрямую, а не ['']
как str.split
делает. Пример:
>>> import csv, io
>>> f = io.StringIO('\n\na,b,c\n1,2,3\n\n')
>>> [row for row in csv.reader(f) if row] # Stripping easily
[['a', 'b', 'c'], ['1', '2', '3']]
против того же подхода с str.split(',')
который все еще не обрабатывает цитирование, экранирование, так далее.:
>>> f = io.StringIO('\n\na,b,c\n1,2,3\n\n')
>>> stripped = (line.rstrip('\r\n') for line in f) # Must manually strip line endings first
>>> [line.split(',') for line in stripped if line]
[['a', 'b', 'c'], ['1', '2', '3']]
в вашем случае он действительно не пуст
Если вы хотите проверить, пуст ли элемент в этом списке, вы можете сделать:
string = ''.split(',')
if not string[0]:
print "empty"
результат разделения не пуст. Чувство "пустоты", которое вы ищете, лучше всего проверить, посмотрев на оригинальную неразрезанную строку:
if not original_string:
# It's empty.
но если вы действительно хотите посмотреть на результат разделения для этого:
if len(split_result) == 1 and not split_result[0]:
# It's "empty".
По словам str.split()
документация " разделение пустой строки с указанным разделителем возвращает ["]."
чтобы проверить этот случай, когда вы используете явный разделитель (например, использование split(",")
), сделать что-то вроде этого:
l = s.split(",")
if len(l) == 1 and l[0] == '':
print("string was empty")