Python计数器值和boolean all()未按预期工作

2024-04-18 13:24:15 发布

您现在位置:Python中文网/ 问答频道 /正文

这真让我难堪。我有一堆计数器,我想检查是否所有的值都满足某个条件。使用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()处理iterables,Counter.values()返回iterable,单个值是整数,但是:

>>> all(my_counter.values())>1
False

我错过了什么?你知道吗


Tags: fromimportfalsemycounter计数器整数all
2条回答

试着检查一下这个代码。最后一行做你想做的事。 all(my_counter.values())告诉我们计数器中的所有值是否都是iterable。检查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,所以它们被认为是真的,所以:

>>> all(my_counter.values())
True

但是True(其行为类似于整数1)不是> 1,因此结果将是False

>>> all(my_counter.values()) > 1
False

您想要检查的是,如果每个值都大于一,那么您可以使用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

或者使用生成器表达式“转换”传递给all的iterable:

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

相关问题 更多 >