Значения счетчика Python и логическое значение all () не работают должным образом - PullRequest
0 голосов
/ 04 июня 2018

Это действительно меня озадачило.У меня есть несколько счетчиков, и я хочу проверить, соответствуют ли все значения определенному условию.Использование 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() возвращает итерируемое, отдельные значения являются целыми числами, и все же:

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

Чтоя здесь скучаю?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

all по существу просто делает:

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

Это означает, что он просто проверит, являются ли все values «правдивыми», в вашем случае все значения равны != 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:

>>> 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
0 голосов
/ 04 июня 2018

Попробуйте и проверьте этот код.Последняя строка делает то, что вы собираетесь делать.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()))
...