Если все в списке == что-то - PullRequest
25 голосов
/ 02 января 2009

Используя Python 2.6, есть ли способ проверить, равны ли все элементы последовательности заданному значению, в одном операторе?

[pseudocode]
my_sequence = (2,5,7,82,35)

if all the values in (type(i) for i in my_sequence) == int:
     do()

Вместо сказать:

my_sequence = (2,5,7,82,35)
all_int = True
for i in my_sequence:
    if type(i) is not int:
        all_int = False
        break

if all_int:
    do()

Ответы [ 4 ]

55 голосов
/ 02 января 2009

Использование:

all( type(i) is int for i in lst )

Пример:

In [1]: lst = range(10)
In [2]: all( type(i) is int for i in lst )
Out[2]: True
In [3]: lst.append('steve')
In [4]: all( type(i) is int for i in lst )
Out[4]: False

[Изменить]. Сделано чище согласно комментариям.

13 голосов
/ 02 января 2009

Вы имеете в виду

all( type(i) is int for i in my_list )

Редактировать: изменено на is. Чуть быстрее.

8 голосов
/ 02 января 2009

Я бы предложил:

if all(isinstance(i, int) for i in my_list):

all и any впервые появились в 2006 году с Python 2.5 (функция реализована Рэймондом Хеттингером) .
Если вы используете более старую версию Python, ссылки предоставляют примеры реализации.

Я также предлагаю использовать isinstance, поскольку он также будет ловить подклассы int.

1 голос
/ 11 сентября 2013

Ради полноты я подумал, что добавлю тот факт, что NumPy 'all' отличается от встроенного 'all'. Если, например, запуск Python через Python (x, y), NumPy загружается автоматически (и, насколько я знаю, не может быть выгружен), поэтому при попытке запустить приведенный выше код выдает довольно неожиданные результаты:

>>> if (all(v == 0 for v in [0,1])):
...     print 'this should not happen'
... this should not happen

Более подробная информация по этому вопросу содержится в вопросе переполнения стека numpy все отличается от встроенного все . В качестве решения вы можете заключить генератор в квадратные скобки, чтобы получить список:

>>> all( [v == 0 for v in [0,1]] )
False

Или вызовите встроенную функцию явно:

>>> __builtins__.all(v == 0 for v in [0,1,'2'])
False

Я нашел способ запретить Spyder импортировать NumPy по умолчанию: Список импорта модулей Spyder по умолчанию

...