Python计数器值和布尔all()无法按预期工作

时间:2018-06-04 05:36:33

标签: python python-3.x itertools boolean-expression

这真让我难过。我有一堆计数器,我想检查所有值是否满足某个条件。使用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

我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

尝试检查此代码。最后一行是你打算做的。 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()))

答案 1 :(得分:0)

all基本上就是:

def all(iterable):
    for item in iterable:
        if not item:
            return False
    return True

这意味着它只会检查所有values是否属于"真正的",在您的情况下,所有值均为!= 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

或者使用生成器表达式来转换&#34;转换&#34;迭代传递给all

>>> all(value > 1 for value in my_counter.values())
True

请注意,您也可以在此处使用list-comprehension而不是生成器表达式:

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