Подтвердить что ты не робот

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

In [27]: map( lambda f,p: f.match(p), list(patterns.itervalues()), vatids )
Out[27]: [None, <_sre.SRE_Match object at 0xb73bfdb0>, None]

В списке может быть все None или один из них является экземпляром re.Match. Что я могу проверить в одном из проверок в возвращаемом списке, чтобы сообщить мне, что все содержимое None?

4b9b3361

Ответ 1

all(v is None for v in l)

вернет True, если все элементы l равны None

Обратите внимание, что l.count(None) == len(l) выполняется намного быстрее, но требует, чтобы l был фактическим list, а не только итерируемым.

Ответ 2

not any(my_list)

возвращает True, если все элементы my_list являются ложными.

Изменить. Поскольку объекты соответствия всегда правдоподобны, а None является ложным, это даст тот же результат, что и all(x is None for x in my_list) для рассматриваемого случая. Как показано в ответе gnibbler, использование any() на сегодняшний день является более быстрой альтернативой.

Ответ 3

Поскольку объекты Match никогда не будут оцениваться как false, это нормально и намного быстрее, просто используйте not any(L)

$ python -m timeit -s"L=[None,None,None]" "all( v is None for v in L )"
100000 loops, best of 3: 1.52 usec per loop
$ python -m timeit -s"L=[None,None,None]" "not any(L)"
1000000 loops, best of 3: 0.281 usec per loop

$ python -m timeit -s"L=[None,1,None]" "all( v is None for v in L )"
100000 loops, best of 3: 1.81 usec per loop
$ python -m timeit -s"L=[None,1,None]" "not any(L)"
1000000 loops, best of 3: 0.272 usec per loop

Ответ 4

Или немного странно, но:

a = [None, None, None]
set(a) == set([None])

ИЛИ

if [x for x in a if x]: # non empty list
    #do something   

Редакция:

def is_empty(lVals):
    if not lVals:
        return True
    for x in lVals:
        if x:
            return False
    return True

Ответ 5

is_all_none = lambda L: not len(filter(lambda e: not e is None, L))

is_all_none([None,None,'x'])
False
is_all_none([None,None,None])
True