重塑字典键

时间:2019-05-21 20:38:35

标签: python dictionary key

我有一本带有二维键的字典:

{('a','b'):2,('a','d'):3,('b','e'):4,('b','f'): 5}。

想创建像

这样的嵌套字典

{'a':{'b':2,'d':3},'b':{'e':4,'f':5}

是否有一种聪明的方法(而不是使用循环)?

2 个答案:

答案 0 :(得分:2)

使用循环和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的结果使用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循环中keyfunck分组的地方

计时

defaultdict

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

itertools

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