Ну, классический подход к этой проблеме - создать defaultdict:
import collections
histogram = collections.defaultdict(int)
Затем переберите словари в списке и (используя d_list
вместо d
в качестве названия списка словарей),
for d in d_list:
histogram[d['age']] += 1
Но вы включили дополнительную информацию, которая смущает меня. Вы сказали, что несколько слов могут представлять одного и того же пользователя. Вы хотите удалить эти дубликаты из гистограммы? Если это ваш вопрос, один из подходов - хранить пользователей в формате 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
нет. Теперь получить количество возрастов так же просто, как пропустить значения через Counter
.
>>> collections.Counter(user_ages.itervalues())
Counter({23: 2, 33: 1})
То же самое можно сделать с любой строкой или неизменным объектом, который может служить уникальным идентификатором конкретного пользователя.