我有一个带有二维键的字典:
{('a','b'):2,('a','d'):3,('b','e'):4,('b','f'): 5}.
想创建一个嵌套的字典
{'a':{'b': 2,'d':3},'b':{'e':4, 'f':5}
有没有一种聪明的方法可以做到这一点(而不是使用循环)?
最佳答案
使用循环和defaultdict
我不确定您是否可以在没有循环的情况下执行此操作,但您可以使用 defaultdict
在这里解压所有的键和值:
from collections import defaultdict
d = defaultdict(dict)
something = {('a','b'):2,('a','d'):3,('b','e'):4,('b','f'):5}
for (k, k1), v in something.items():
d[k][k1] = v
print(d)
defaultdict(<class 'dict'>, {'a': {'b': 2, 'd': 3}, 'b': {'e': 4, 'f': 5}})
字典理解和 itertools groupby
或者,您可以对 itertools.groupby
的结果使用字典推导式
from itertools import groupby
something = {('a','b'):2,('a','d'):3,('b','e'):4,('b','f'):5}
d = dict((i, {k1: v for (k, k1), v in x}) for i,x in groupby(something.items(), key = lambda x: x[0][0]))
{'a': {'b': 2, 'd': 3}, 'b': {'e': 4, 'f': 5}}
keyfunc
根据 native defaultdict 循环中的 k
进行分组
时机
默认字典
python -m timeit -s 'import defaultdictloop as lp; something=lp.something' 'lp.defaultdict_loop(something)'
1000000 loops, best of 3: 0.557 usec per loop
迭代工具
python -m timeit -s 'import defaultdictloop as lp; something=lp.something' 'lp.itertools_loop(something)'
100000 loops, best of 3: 2.56 usec per loop
关于python - reshape 字典键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56246020/