python:从字典中创建直方图

标签 python dictionary

我是 python 的新手,正在学习如何以正确的方式做事。

我有字典列表 d。每个字典代表用户,并包含 user_id、年龄等信息。此列表 d 可以包含多个代表同一用户的字典(但略有不同的信息对我的目的无关紧要)。我想创建直方图,显示在给定年龄的 d 中有多少用户。如何高效地做到这一点?

编辑: 我想强调的是,我需要消除列表中的重复项。

最佳答案

嗯,解决这个问题的经典方法是创建一个 defaultdict:

import collections
histogram = collections.defaultdict(int)

然后遍历列表中的字典,并且(使用 d_list 而不是 d 作为字典列表的名称),

for d in d_list:
    histogram[d['age']] += 1

但是您包含了让我感到困惑的其他信息。你说多个字典可以代表同一个用户。你想从直方图中消除那些重复项吗?如果这是您的问题,一种方法是使用 (firstname, lastname) 元组作为键将用户存储在 user_records 的字典中。然后代表同一用户的连续字典将相互粉碎,每个用户只保留一条记录。然后遍历 that 字典中的值(可能使用 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})

同样的事情可以用任何字符串或不可变对象(immutable对象)来完成,它们可以作为特定用户的唯一标识符。

关于python:从字典中创建直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9182516/

相关文章:

python - 如何使用openpyxl删除Excel中的第一行

python - 在不关闭 Python 中的 Selenium Webdriver session 的情况下捕获 `KeyboardInterrupt`

java - 在 Java 中使用++ 一元运算符与 Map Get 函数

arrays - 检查字典是否在 Swift 3 中的字典数组中

c - 你知道支持 COW 事务的 C 字典吗?

python - 获取 pandas 中某一列的值

python - 函数工厂中变量的范围

python - pip install MySQL-python 在 Linux 中失败

javascript - 英格兰、威尔士和苏格兰等的 Highmaps map

Java:如何使用 HashMap 的一对键