Если все в списке == что-то
Используя 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()
Ответы
Ответ 1
Использование:
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
[Изменить]. Сделано чище в соответствии с комментариями.
Ответ 2
Вы имеете в виду
all( type(i) is int for i in my_list )
?
Изменить: изменено на is
. Чуть быстрее.
Ответ 3
Я бы предложил:
if all(isinstance(i, int) for i in my_list):
all
и any
впервые появился в Python 2.5. Если вы используете более старую версию Python, ссылки предоставляют примеры реализации.
Я также предлагаю использовать isinstance
, так как он также поймает подклассы int
.
Ответ 4
Для полноты я подумал, что добавлю, что NumPy "все" отличается от встроенного "все". Если, например, запуск 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