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

Предположим, у меня есть пустая строка, она будет разделена:

>>>''.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")