Подтвердить что ты не робот

Python 2.7 Подсчет количества позиций словаря с заданным значением

первый вопрос здесь, поэтому я получу право на него:

используя python 2.7

У меня есть словарь элементов, ключи - это координата x, y, представленная в виде кортежа: (x, y), и все значения являются логическими значениями.

Я пытаюсь вычислить быстрый и чистый метод получения подсчета количества элементов, имеющих заданное значение. Мне НЕ нужно знать, какие ключи имеют заданное значение, сколько.

здесь есть аналогичная запись: Сколько элементов в словаре имеет одно и то же значение в Python, однако мне не нужен словарь, а только целое число.

Моя первая мысль состоит в том, чтобы перебирать элементы и проверять каждый, сохраняя подсчет каждого значения True или что-то в этом роде. Мне просто интересно, так как я все еще новичок в python и не знаю всех библиотек, если есть лучший/более быстрый/более простой способ сделать это.

заблаговременно.

4b9b3361

Ответ 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