将一个字典中包含多个字典的数据结构转换为一个字典中包含多个列表的数据结构。

5

我有一个字典的字典:

d = {"a": {"x":1, "y":2, "z":3}, "b": {"x":2, "y":3, "z":4}, "c": {"x":3, "y":4, "z":5}}

我想将其转换为:
new_d = {"x":[1, 2, 3], "y": [2, 3, 4], "z": [3, 4, 5]}

要求是new_d[key][i]new_d[another_key][i]应该在同一个d的子字典中。

所以我创建了new_d = {},然后:

for key in d.values()[0].keys():
    new_d[key] = [d.values()[i][key] for i in range(len(d.values()))]

这给了我我想要的结果,但我想知道是否有一些内置函数可以执行此操作或者是否有更好的方法来实现它。
2个回答

7

没有内置的函数执行此操作。我只需直接循环遍历 values

new_d = {}
for sub in d.itervalues():              # Python 3: use d.values()
    for key, value in sub.iteritems():  # Python 3: use d.items()
        new_d.setdefault(key, []).append(value)

这样可以避免每次调用dict.values()时创建新的列表。
请注意,字典没有顺序。结果列表中的值将符合您的条件; 它们将按照相同的顺序添加到new_d中的每个键中:
>>> d = {"a": {"x":1, "y":2, "z":3}, "b": {"x":2, "y":3, "z":4}, "c": {"x":3, "y":4, "z":5}}
>>> new_d = {}
>>> for sub in d.values():
...     for key, value in sub.items():
...         new_d.setdefault(key, []).append(value)
...
>>> new_d
{'x': [1, 2, 3], 'y': [2, 3, 4], 'z': [3, 4, 5]}

0

列表推导式方法

如果你喜欢使用字典和列表推导式...

d1 = {"a": {"x": 1, "y": 2, "z": 3},
      "b": {"x": 2, "y": 3, "z": 4},
      "c": {"x": 3, "y": 4, "z": 5}}

dl1 = {kl: [v for di in d1.values() for k, v in di.items() if k == kl]
       for di in d1.values() for kl in di.keys()}

print(dl1)

并产生了期望的结果...

{'x': [1, 2, 3], 'y': [2, 3, 4], 'z': [3, 4, 5]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接