如何重新配置 此字典以更改其键

问题描述 投票:2回答:3

假设我有这本词典:

>>> dic = {('a', 'l'):3, ('a', 'p'):2, ('b', 'l'):4, ('b', 'p'):1}

我怎么编辑它所以我可以这样:

>>> dic_new = {'a':{'l':3, 'p':2}, 'b':{'l':4, 'p':1}}

每当我更改密钥时,我都会收到错误消息。我很迷惑。

python python-3.x dictionary
3个回答
1
投票

在每种情况下,你想设置d2[k1][k2]=v,无论你有d1[k1,k2]=v。最简单的方法是从defaultdict开始。

>>> from collections import defaultdict
>>> d1 = {('a', 'l'):3, ('a', 'p'):2, ('b', 'l'):4, ('b', 'p'):1}
>>> d2 = defaultdict(dict)
>>> for k1, k2 in d1:
...    d2[k1][k2] = d[k1,k2]
...
>>> d2
defaultdict(<class 'dict'>, {'a': {'l': 3, 'p': 2}, 'b': {'l': 4, 'p': 1}})
>>> dict(d2)
{'a': {'l': 3, 'p': 2}, 'b': {'l': 4, 'p': 1}}

如果您不想使用defaultdict,请使用setdefault方法。

d2 = {}
for k1, k2 in d1:
    d2.setdefault(k1, {})[k2] = d1[k1,k2]

1
投票

您可以遍历原始字典并在找到键时创建一个新字典:

dic = {('a', 'l'):3, ('a', 'p'):2, ('b', 'l'):4, ('b', 'p'):1}
dic_new = {}
for (new_key, new_sub_key),value in dic.items():
    if new_key not in dic_new:
        dic_new[new_key] = {}
    dic_new[new_key][new_sub_key] = value
print(dic_new)

Output

{'a': {'l': 3, 'p': 2}, 'b': {'l': 4, 'p': 1}}

0
投票

你可以使用groupby + OrderedDict

from itertools import groupby
from collections import OrderedDict

dic = {('a', 'l'):3, ('a', 'p'):2, ('b', 'l'):4, ('b', 'p'):1}

dic = OrderedDict(dic)
new_d = {}

for k, g in groupby(dic, lambda x: x[0]):
    for x in g:
        if k in new_d:
            new_d[k].update({x[1]: dic[x]})
        else:
            new_d[k] = {x[1]: dic[x]}

print(new_d)
# {'a': {'l': 3, 'p': 2}, 'b': {'l': 4, 'p': 1}}

或者,如果您可以保证字典按照元组键中的第一个值排序,您可以直接忽略OrderedDict

© www.soinside.com 2019 - 2024. All rights reserved.