Python 计数器值和布尔 all() 未按预期工作
Python counter values and boolean all() not working as expected
这真是让我难住了。我有一堆计数器,我想检查是否所有值都满足特定条件。使用 all()
是有道理的。所以我这样设置:
>>> from collections import Counter
>>> my_counter = Counter(['a', 'b', 'a', 'c', 'a', 'b', 'c'])
>>> my_counter
Counter({'a': 3, 'b': 2, 'c': 2})
all()
适用于可迭代对象,Counter.values()
returns 可迭代对象,各个值是整数,但是:
>>> all(my_counter.values())>1
False
我在这里错过了什么?
尝试并检查此代码。最后一行执行您打算执行的操作。
all(my_counter.values())
告诉我们计数器中的所有值是否都是可迭代的。检查 https://www.programiz.com/python-programming/methods/built-in/all
#python 3.5.2
from collections import Counter
my_counter = Counter(['a', 'b', 'a', 'c', 'a', 'b', 'c'])
for row in ((my_counter.values())):
print(row)
print(all(i > 1 for i in my_counter.values()))
all
本质上就是:
def all(iterable):
for item in iterable:
if not item:
return False
return True
这意味着它只会检查是否所有 values
都是 "truthy",在您的情况下所有值都是 != 0
,因此它们被认为是 True,因此:
>>> all(my_counter.values())
True
但是 True
(其行为类似于整数 1
)不是 > 1
,因此结果将是 False
:
>>> all(my_counter.values()) > 1
False
你想要的是检查每个值是否都大于 1,那么你可以使用 all
:
的自写变体
def all_greater_than_one(iterable):
for item in iterable:
if item <= 1:
return False
return True
>>> all_greater_than_one(my_counter.values())
True
或者使用生成器表达式 "transform" 传递给 all
的可迭代对象:
>>> all(value > 1 for value in my_counter.values())
True
请注意,您也可以在此处使用列表推导式而不是生成器表达式:
>>> all([value > 1 for value in my_counter.values()])
True
或者其他一些转换它的方法——我不推荐以下方法,因为生成器或理解通常更好,只是为了展示一些替代方法:
>>> all(map(lambda x: x > 1, my_counter.values()))
True
>>> all(map((1).__le__, my_counter.values())) # avoid this, just here for entertainment.
True
这真是让我难住了。我有一堆计数器,我想检查是否所有值都满足特定条件。使用 all()
是有道理的。所以我这样设置:
>>> from collections import Counter
>>> my_counter = Counter(['a', 'b', 'a', 'c', 'a', 'b', 'c'])
>>> my_counter
Counter({'a': 3, 'b': 2, 'c': 2})
all()
适用于可迭代对象,Counter.values()
returns 可迭代对象,各个值是整数,但是:
>>> all(my_counter.values())>1
False
我在这里错过了什么?
尝试并检查此代码。最后一行执行您打算执行的操作。
all(my_counter.values())
告诉我们计数器中的所有值是否都是可迭代的。检查 https://www.programiz.com/python-programming/methods/built-in/all
#python 3.5.2
from collections import Counter
my_counter = Counter(['a', 'b', 'a', 'c', 'a', 'b', 'c'])
for row in ((my_counter.values())):
print(row)
print(all(i > 1 for i in my_counter.values()))
all
本质上就是:
def all(iterable):
for item in iterable:
if not item:
return False
return True
这意味着它只会检查是否所有 values
都是 "truthy",在您的情况下所有值都是 != 0
,因此它们被认为是 True,因此:
>>> all(my_counter.values())
True
但是 True
(其行为类似于整数 1
)不是 > 1
,因此结果将是 False
:
>>> all(my_counter.values()) > 1
False
你想要的是检查每个值是否都大于 1,那么你可以使用 all
:
def all_greater_than_one(iterable):
for item in iterable:
if item <= 1:
return False
return True
>>> all_greater_than_one(my_counter.values())
True
或者使用生成器表达式 "transform" 传递给 all
的可迭代对象:
>>> all(value > 1 for value in my_counter.values())
True
请注意,您也可以在此处使用列表推导式而不是生成器表达式:
>>> all([value > 1 for value in my_counter.values()])
True
或者其他一些转换它的方法——我不推荐以下方法,因为生成器或理解通常更好,只是为了展示一些替代方法:
>>> all(map(lambda x: x > 1, my_counter.values()))
True
>>> all(map((1).__le__, my_counter.values())) # avoid this, just here for entertainment.
True