python嵌套字典代码_python – 从元组中任意嵌套的字典

news/2024/7/5 13:36:24 标签: python嵌套字典代码

只需循环遍历每个键,并使用除键的最后一个元素之外的所有元素来添加词典.保持对如此设置的最后一个字典的引用,然后使用键元组中的最后一个元素在输出字典中实际设置键值对:

def nest(d: dict) -> dict:

result = {}

for key, value in d.items():

target = result

for k in key[:-1]: # traverse all keys but the last

target = target.setdefault(k, {})

target[key[-1]] = value

return result

from functools import reduce

def nest(d: dict) -> dict:

result = {}

traverse = lambda r, k: r.setdefault(k, {})

for key, value in d.items():

reduce(traverse, key[:-1], result)[key[-1]] = value

return result

我使用了dict.setdefault()而不是auto-vivication defaultdict(nested_dict)选项,因为这会生成一个常规字典,当它们尚不存在时不会进一步隐式添加密钥.

演示:

>>> from pprint import pprint

>>> pprint(nest(d1))

{'A': {0: 0, 1: 1}, 'B': {0: 2, 1: 3}}

>>> pprint(nest(d2))

{'A': {0: {False: 1, True: 0}, 1: {False: 3, True: 2}},

'B': {0: {False: 5, True: 4}, 1: {False: 7, True: 6}}}

>>> pprint(nest(d3))

{'C': {0: {False: {'A': 2, 'B': 3}, True: {'A': 0, 'B': 1}},

1: {False: {'A': 6, 'B': 7}, True: {'A': 4, 'B': 5}}},

'D': {0: {False: {'A': 10, 'B': 11}, True: {'A': 8, 'B': 9}},

1: {False: {'A': 14, 'B': 15}, True: {'A': 12, 'B': 13}}}}

注意,上面的解决方案是一个干净的O(N)循环(N是输入字典的长度),而Ajax1234提出的groupby解决方案必须对输入进行排序才能工作,从而使其成为O(NlogN)解决方案.这意味着对于具有1000个元素的字典,groupby()将需要10.000步来产生输出,而O(N)线性循环仅需要1000步.对于一百万个键,这增加到2000万步等.

此外,Python中的递归速度很慢,因为Python无法将这些解决方案优化为迭代方法.函数调用相对昂贵,因此使用递归会带来显着的性能成本,因为您会大大增加函数调用的数量并扩展帧堆栈操作.

计时表明这有多重要;使用您的样品d3和100k运行,我们很容易看到5倍的速度差异:

>>> from timeit import timeit

>>> timeit('n(d)', 'from __main__ import create_nested_dict as n, d3; d=d3.items()', number=100_000)

8.210276518017054

>>> timeit('n(d)', 'from __main__ import nest as n, d3 as d', number=100_000)

1.6089267160277814


http://www.niftyadmin.cn/n/1425407.html

相关文章

jsf和myface上传文件

jsf和myface上传文件气死我了 <% taglib uri"http://myfaces.apache.org/tomahawk" prefix"x"%> <h:form id"createForm" enctype"multipart/form-data"><td class"tdbg4" width"100"> …

python用字典编写购物程序_day 5 - 2 字典(dict)练习

1. 有如下变量&#xff08;tu 是个元祖&#xff09;&#xff0c;请实现要求的功能 tu {"alex",[11,22,{"k1":v1,"k2":["age","name"],"k3":(11,22,33)},44]} #1&#xff09;讲述元祖的特性 子元素不可以被修改&a…

jsf的安全问题

如果破解一个系统的代价比系统本来内容的价值还要高&#xff0c;则系统就是安全的。1口令加密存储 相同的密码在数据库中显示的值不一定相同,这就是加盐的效果。知识补充&#xff1a;1&#xff09;JAVA密码架构&#xff08;JCA&#xff09;是由java.security包和子包中的一系…

并联系统的失效率公式推导步骤_小学数学一类求阴影部分周长和面积,记住两个公式就够了...

同学们好&#xff0c;我是小升初数学课堂。在小学数学学习的过程当中&#xff0c;我们要学会不断的总结。如果把一类题目&#xff0c;总结到位&#xff0c;下次再碰到这类题目就很轻松的解决了&#xff0c;比如说在学习六年级圆的当中&#xff0c;有一类求阴影部分周长和面积的…

selenium设置元素等待(python)

WebDriver提供了两种类型的元素等待&#xff1a;显式等待和隐式等待。 显式等待&#xff1a;WebDriver等待某个条件成立则继续执行&#xff0c;否则在达到最大时长时抛出超时异常(TimeoutException) WebDriverWait类是WebDriver提供的等待方法。在设置的时间内&#xff0c;默认…

MyEclipse 快捷键大全

CtrlQ跳到最后一次的编辑处F7由函数内部返回到调用处。F8一直执行到下一个断点。CtrlShiftS保存所有未保存的文件。Ctrl1 快速修复AltEnter 显示当前选择资源(工程,or 文件 or文件)的属性 ShiftEnter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)S…

docker 覆盖 entrypoint_Docker基础教程(2)-如何创建一个定制镜像并上传到DockerHub

如果对Docker还不是很了解的同学可以先看一下我之前的文章Docker基础教程(1)定制镜像的两种方式将容器打包成镜像容器和镜像之间是可以互相转变的,镜像可以运行成容器,容器也可以打包成镜像,可以将所有数据打包起来,原封不动的变成一个镜像 首先了解一下打包的命令docker commi…

结构体中函数应该怎样定义才能返回值_单片机编程时可变参函数的实现

新的多功能使用主控模块块的设计&#xff0c;板与板之间使用自定的协议来传递数据&#xff0c;在程序书写上&#xff0c; 我希望写成一个通用的数据协议&#xff0c;这样这个协议可以在后续直接移植我以后相当长一个时间内的其它产品上&#xff0c;这其中就需要用到可变参函数。…