在Python中对all()运算符有疑问。 说
array = ["one","one","one"]
all( x=="one" for x in array ) <<--- i want to check for all "one" in array
以上似乎有效。但是,如果我有
array = []
all( x=="one" for x in array ) <<--- this still return true to me.
行为是我希望如果所有项目都不是“一”则返回false。怎么做?感谢
答案 0 :(得分:1)
您可以阅读all()
,如果它意味着:
如果任何项目评估为
False
,则返回False
。否则True
。
所以一个空集将返回True
,因为没有任何一个会使它成为假。
一般来说,在空集中,所有元素都满足您可以想象的任何要求。这是逻辑原理,而不是Python,BTW。
答案 1 :(得分:1)
all
的实施等同于this
def all(iterable):
for element in iterable:
if not element:
return False
return True
因此,它返回True
,直到iterable中的任何元素都是Falsy。在你的情况下,没有发生。这就是为什么它返回True
答案 2 :(得分:1)
怎么做?
array and all(x=="one" for x in array)
空列表为false,因此结果为false,all
部分为真无关紧要。
如果你想处理像list
这样的容器之外的迭代,那么它就更难了。我想你需要这样的东西:
set(x=="one" for x in iterable) == { True }
虽然如果你关心速度,整体上应该更快,因为上面的版本不会像all
那样短路:
def nonempty_all(iterable):
iterator = iter(iterable)
try:
if not next(iterator):
return False
except StopIteration:
return False
return all(iterator)
答案 3 :(得分:1)
all
始终返回True
以获取空列表/元组/等。这是因为从技术上讲,空集合中的每个项目都能满足任何条件。
要解决此问题,您需要添加一些其他代码来测试您的列表是否为空。幸运的是,空列表在Python中评估为False
,因此您可以这样做:
>>> array = []
>>> bool(array and all(x=="one" for x in array))
False
>>> if array and all(x=="one" for x in array):
... print True
... else:
... print False
...
False
>>>