Python:使用迭代器中的键声明字典

时间:2015-10-14 09:31:51

标签: python dictionary

我是一名Python新手,我正在努力重组嵌套字典中包含的数据。原始数据是这样的:

['period_1': {'metric_1':{'person_1': 0, 'person_2': 1}, 
{'metric_2': {'person_1': 2, 'person_2': 3}}, 'period_2' :{ ...}

我想要获得的是面板数据,以人为主键,后跟句点,后跟指标。像这样:

{'person_1': {'period_1': {'metric_1': 0, 'metric_2': 2}, 'period_2':
{'metric_1': 4, 'metric_2': 6}, 'period_2'{ ... }}, 'person_2': { ...}

到目前为止我尝试了什么(字典allUsers将成为我存储重组数据的地方。它已经有人的ID作为键,空的dicts作为值):

allUsers = {'pippo':{}, 'pluto':{}}

for t in range (len (periods)):
for user in allUsers:
    allUsers[user][t] = {}
period = periods[t]
for metric in period:
    for person in period[metric]:
        allUsers[person][t] = {metric: period[metric][person]}

出于某种原因,这不起作用。它只存储两个指标中的一个。

>>> allUsers
{'pippo': {0: {'metric1': 1}, 1: {'metric1': 1}},
'pluto': {0: {'metric1': 2}, 1: {'metric1': 1}}}

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

问题是,对于您找到的每个新时段/指标,您正在创建新词典并在该行中添加allUsers[person][t] -

allUsers[person][t] = {metric: period[metric][person]}

因此只有一次。如果t中已存在allUsers,您实际上想要添加新的键/值。示例 -

for metric in period:
    for person in period[metric]:
        allUsers[person][t][metric] = period[metric][person]

但假设periods是字典,您可以使用dict.setdefault来简化此操作。示例 -

result = {}
for period, value in periods.items():
    for metric, v in value.items():
        for person,val in v.items():
            result.setdefault(person,{}).setdefault(period,{}).set(metric,val)

答案 1 :(得分:0)

您需要对句点,指标和人员进行迭代,因此复合键[person] [period]对于每个迭代步骤都不会是唯一的。当您分配给该密钥时,您将覆盖之前的任何内容,即先前的度量字典。