Ну, классический подход к решению этой проблемы можно было бы создать defaultdict:
import collections
histogram = collections.defaultdict(int)
Тогда итерации по словарях в списке, и (с помощью d_list
вместо d
как имя списка словарей),
for d in d_list:
histogram[d['age']] += 1
Но вы указали дополнительную информацию, которая меня смущает. Вы сказали, что несколько dicts могут представлять одного и того же пользователя. Вы хотите удалить эти дубликаты из гистограммы? Если это ваш вопрос, один из подходов заключался бы в том, чтобы хранить пользователей в типе user_records
, используя (firstname, lastname)
кортежей в качестве ключей. Затем последовательные словари, представляющие одного и того же пользователя, будут разбивать друг друга, и только одна запись на пользователя будет сохранена. Затем перебирайте значения в , чтобы словарь (возможно, с использованием user_records.itervalues()
).
Этот общий подход может быть изменен для использования любых значений в каждой записи, которые наилучшим образом идентифицируют уникальных пользователей. Если значение user_id
уникально для каждого пользователя, используйте его как ключ вместо (firstname, lastname)
. Но ваш вопрос предложил (мне), что user_id
не обязательно будет одинаковым для двух пользователей, которые являются одинаковыми.
После того как вы исключенные дубликаты, хотя, есть также ярлык, если вы используете Python> = 2.7:
histogram = collections.Counter(d['age'] for d in user_records.itervalues())
Некоторые примеры кода ... что у нас есть record_list
:
>>> record_list
[{'lastname': 'Mann', 'age': 23, 'firstname': 'Joe'},
{'lastname': 'Moore', 'age': 23, 'firstname': 'Alex'},
{'lastname': 'Sault', 'age': 33, 'firstname': 'Marie'},
{'lastname': 'Mann', 'age': 23, 'firstname': 'Joe'}]
>>> user_ages = dict(((d['firstname'], d['lastname']), d['age']) for d in record_list)
>>> user_ages
{('Joe', 'Mann'): 23, ('Alex', 'Moore'): 23, ('Marie', 'Sault'): 33}
Как вы можете видеть, у record_list
есть дубликат, но user_ages
dict нет. Теперь получение количества возрастов так же просто, как запуск значений через Counter
.
>>> collections.Counter(user_ages.itervalues())
Counter({23: 2, 33: 1})
То же самое можно сделать с помощью любой строки или неизменного объекта, который может служить в качестве уникального идентификатора конкретного пользователя.
Не могли бы вы развернуть это: «Один из подходов заключался бы в том, чтобы хранить пользователей в типе user_records с использованием (firstname, lastname) кортежей в качестве ключей. Затем последовательные словари, представляющие одного и того же пользователя, разбивали бы друг друга, и только одна запись на пользователя быть сохраненным ». – ashim
Обратите внимание, что вы на самом деле имеете в виду «Python> = 2.7». :) – Dougal
Кортежи строк могут быть ключом в словаре, и любой данный ключ может появляться в словаре только один раз, поэтому любые дубликаты будут автоматически удалены. Я отправлю код примера. – senderle