Использование цикла и 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}})
Понимание Dict и groupby itertools
Кроме того, вы можете использовать понимание DICT по результатам 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
группируется по тому, что k
в собственном цикле defaultdict
Сроки
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