我是 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/