【问题标题】:Efficent way to generate multiple dictionaries in a list [duplicate]在列表中生成多个字典的有效方法[重复]
【发布时间】:2020-04-15 15:55:24
【问题描述】:

我有一个带有以下格式的字典

dic = {
          'x':[1, 2, 3, 4], 
          'y':[2, 4, 5, 6], 
          'z':['a', 'b', 'c', 'g'],
          'a':['d', 'e', 'f', 'a'], 
}

我想把它转换成下面的格式

lst_wth_dic = [

               {'x':1, 'y':2, 'z': 'a', 'a':'d'}, 
               {'x':2, 'y':4, 'z':'b', 'a':'e'},
               {'x':3, 'y':5, 'z':'c', 'a': 'f'}, 
               {'x':4, 'y':6, 'z':'g', 'a': 'a'}
]

到目前为止我尝试过的是这个

import copy
lst_wth_dic = []
b = {}
for key, val in dic.items():
     for item in val:
             b[key] = item
     c = copy.copy(b)
     lst_wth_dic.append(c)

它没有达到我想要的输出。

【问题讨论】:

标签: python dictionary


【解决方案1】:

你可以这样做:

d = {
          'x':[1, 2, 3, 4],
          'y':[2, 4, 5, 6],
          'z':['a', 'b', 'c', 'g'],
          'a':['d', 'e', 'f', 'a'],
}

lst_dic = [dict(zip(d.keys(), vs)) for vs in zip(*d.values())]

print(lst_dic)

输出

[{'a': 'd', 'x': 1, 'y': 2, 'z': 'a'},
 {'a': 'e', 'x': 2, 'y': 4, 'z': 'b'},
 {'a': 'f', 'x': 3, 'y': 5, 'z': 'c'},
 {'a': 'a', 'x': 4, 'y': 6, 'z': 'g'}]

表达式:

zip(*d.values())

创建以下可迭代对象:

[(1, 2, 'a', 'd'), (2, 4, 'b', 'e'), (3, 5, 'c', 'f'), (4, 6, 'g', 'a')]

然后对于每个元组zip 使用d 的键。上面的list comprehension等价于下面的for循环:

lst_dic = []
for vs in zip(*d.values()):
    lst_dic.append(dict(zip(d.keys(), vs)))

【讨论】:

    【解决方案2】:

    您可以在列表推导中进行 dict 推导:

       lst_wth_dic = [{k:v[i] for k, v in dic.items()} for i in range(4)]
    

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2021-12-01
      • 2021-04-03
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      相关资源
      最近更新 更多