Python 2.7 Подсчет количества позиций словаря с заданным значением
первый вопрос здесь, поэтому я получу право на него:
используя python 2.7
У меня есть словарь элементов, ключи - это координата x, y, представленная в виде кортежа: (x, y), и все значения являются логическими значениями.
Я пытаюсь вычислить быстрый и чистый метод получения подсчета количества элементов, имеющих заданное значение. Мне НЕ нужно знать, какие ключи имеют заданное значение, сколько.
здесь есть аналогичная запись:
Сколько элементов в словаре имеет одно и то же значение в Python, однако мне не нужен словарь, а только целое число.
Моя первая мысль состоит в том, чтобы перебирать элементы и проверять каждый, сохраняя подсчет каждого значения True или что-то в этом роде. Мне просто интересно, так как я все еще новичок в python и не знаю всех библиотек, если есть лучший/более быстрый/более простой способ сделать это.
заблаговременно.
Ответы
Ответ 1
Эта первая часть в основном для развлечения - я, вероятно, не буду использовать ее в своем коде.
sum(d.values())
получит число значений True
. (Конечно, вы можете получить число значений False
на len(d) - sum(d.values())
).
В более общем плане вы можете сделать что-то вроде:
sum(1 for x in d.values() if some_condition(x))
В этом случае if x
отлично работает вместо if some_condition(x)
и это то, что большинство людей будет использовать в реальном коде)
ИЗ ТРЕХ РЕШЕНИЙ, ПОЛУЧЕННЫХ ЗДЕСЬ, ВЫШЕ ЯВЛЯЕТСЯ САМОЙ ИДИОМАТИЧЕСКОЙ И ОДНОЙ, КОТОРУЮ РЕКОМЕНДУЕТ
Наконец, я полагаю, это можно было бы написать немного умнее:
sum( x == chosen_value for x in d.values() )
Это в том же духе, что и мое первое (веселое) решение, поскольку оно полагается на то, что True + True == 2
. Умный не всегда лучше. Я думаю, что большинство людей считают эту версию немного более неясной, чем предыдущая (и, следовательно, хуже).
Ответ 2
Если вам нужна структура данных, к которой вы можете быстро получить доступ, чтобы проверить счетчики, вы можете попробовать использовать счетчик (как указывает @mgilson, это зависит от того, какие значения являются хешируемыми):
>>> from collections import Counter
>>> d = {(1, 2): 2, (3, 1): 2, (4, 4): 1, (5, 6): 4}
>>> Counter(d.values())
Counter({2: 2, 1: 1, 4: 1})
Затем вы можете подключить значение и получить количество раз:
>>> c = Counter(d.values())
>>> c[2]
2
>>> c[4]
1