python - reshape 字典键

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

有没有一种聪明的方法可以做到这一点(而不是使用循环)?

最佳答案

使用循环和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/

相关文章:

python - 计算 Pandas 多级指数特定级别的增长率

python - seaborn:默认情况下绝望图

python - 使用beautifulsoup获取youtube视频的信息

python - 将列表中的值分配到字典中

java - 为什么自定义对象不是 HashMap 的等效键?

hadoop - Hadoop 中非常大的键值对

python - 连接到 Docker 容器上的 PostgreSQL 数据库

ios - Alamofire 参数未正确序列化

python - 如何从Python中的多个键获取值

c++ - STL通过 map C++反向循环