将字典转换为Python中的另一个结构

时间:2018-07-24 08:30:36

标签: python

我有一个类似下面的字典:

{'activity_count': [10, 11, 12], 'type': ['all', 'paper', 'fpy']}

我想将此字典转换为以下形式:

{'all': {'activity_count': 10}, 'paper': {'activity_count': 11}, 'fpy': {'activity_count': 12}}

我该如何解决?

到目前为止,我尝试了此解决方案,

dic={"activity_count":[10,11,12],"type":["all","paper","fpy"]}
in={}
i=0
for val in dic['type']:
    for v in dic['activity_count']:
        if i== dic['activity_count'].index(v):
            temp={}
            temp['activity_count']=v
            fin[val]=temp
    i+=1

它能按我预期的那样工作,但完成这项任务的方式看来效率很低。有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:11)

尝试一下,这里zip用于从两个列表中获取值并分配每个值:

d = {'activity_count': [10, 11, 12], 'type': ['all', 'paper', 'fpy']}
nd = {j:{'activity_count':i} for i, j in zip(d['activity_count'], d['type'])}
print(nd)

答案 1 :(得分:6)

我会去邮编和字典理解:

test = {'activity_count': [10, 11, 12], 'type': ['all', 'paper', 'fpy']}
solution = {key:{'activity_count':value} for value, key in zip(test["activity_count"],test["type"])}

说明:两个列表的zip通过具有相同索引的两个列表元素进行分组。因此它将把您的列表转换为一个值如下的生成器:[(10, 'all'), (11, 'paper'), (12, 'fpy')]。但是生成器是惰性计算的,因此仅处理元组,当dict理解要求它们时,这样可以节省内存。

dict理解只是在此生成器上进行迭代,并将第二个元素作为键,第一个元素作为值。

答案 2 :(得分:2)

您可以使用enumerate尝试此字典理解:

dictionary = {'activity_count': [10, 11, 12], 'type': ['all', 'paper', 'fpy']}
{e:{"activity_count":dictionary.get("activity_count")[c]} for c,e in enumerate(dictionary.get("type"))}