我有一本带有二维键的字典:
{('a','b'):2,('a','d'):3,('b','e'):4,('b','f'): 5}。
想创建像
这样的嵌套字典{'a':{'b':2,'d':3},'b':{'e':4,'f':5}
是否有一种聪明的方法(而不是使用循环)?
答案 0 :(得分:2)
我不确定您是否可以无循环执行此操作,但是您可以在此处使用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
的结果使用dict理解
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}}
在本机defaultdict循环中keyfunc
按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
答案 1 :(得分:1)
这里是使用列表推导和itertools.groupby而不是显式循环的解决方案。
import itertools as it
d={('a','b'):2,('a','d'):3,('b','e'):4,('b','f'):5}
d_items=[[k[0],k[1],v] for k,v in d.items()]
d_items=sorted(d_items, key=lambda x: x[0])
new_d=dict((k,dict(tuple(v))) for k,v in it.groupby(d_items,lambda x: x.pop(0)))
print(new_d)
{'a': {'b': 2, 'd': 3}, 'b': {'e': 4, 'f': 5}}