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

2024-06-02 06:36:48 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这本字典:

>>> 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}}

每次我换钥匙都会出错。我很困惑。你知道吗


Tags: 编辑new字典钥匙dic
3条回答

您可以使用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。你知道吗

在每种情况下,您都希望将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]

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

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)

输出

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

相关问题 更多 >