33

使用 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

4 回答 4

61

采用:

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

[编辑]。根据评论变得更干净。

于 2009-01-01T21:45:31.037 回答
14

你的意思是

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

?

编辑:更改为is. 稍微快一点。

于 2009-01-01T21:43:29.697 回答
10

我会建议:

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

allany于 2006 年首次出现在Python 2.5 中(由 Raymond Hettinger 实现的功能)
如果您使用的是旧版本的 Python,这些链接提供了示例实现。

我还建议使用isinstance,因为它还会捕获int.

于 2009-01-01T23:06:42.167 回答
1

为了完整起见,我想我会补充一个事实,即 NumPy 的“全部”与内置的“全部”不同。例如,如果通过 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 与 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 默认模块导入列表

于 2013-09-10T20:13:05.680 回答