使用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()
答案 0 :(得分:55)
使用:
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
[编辑]。根据评论制作清洁剂。
答案 1 :(得分:13)
你的意思是
all( type(i) is int for i in my_list )
修改:已更改为is
。稍快一点。
答案 2 :(得分:8)
我建议:
if all(isinstance(i, int) for i in my_list):
all
和any
于2006年首次出现Python 2.5 (feature implemented by Raymond Hettinger)
如果您使用的是旧版本的Python,则链接会提供示例实现。
我还建议使用isinstance
,因为它还会捕获int
的子类。
答案 3 :(得分:1)
为了完整起见,我想我会补充一个事实,即NumPy的'all'与内置的'all'不同。例如,如果通过Python(x,y)运行Python,NumPy会自动加载(并且据我所知也无法卸载),因此在尝试运行上面的代码时会产生相当意外的结果:
>>> if (all(v == 0 for v in [0,1])):
... print 'this should not happen'
... this should not happen
有关此问题的更多信息,请参阅Stack Overflow问题 numpy all differing from builtin all 。作为解决方案,您可以使用括号括起生成器以生成列表:
>>> all( [v == 0 for v in [0,1]] )
False
或明确调用内置函数:
>>> __builtins__.all(v == 0 for v in [0,1,'2'])
False
我找到了一种方法来阻止Spyder默认导入NumPy: Spyder default module import list