Python中的递归函数:获取特定嵌套项列表的最佳方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python中的递归函数:获取特定嵌套项列表的最佳方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2786字,纯文字阅读大概需要4分钟。
内容图文
![Python中的递归函数:获取特定嵌套项列表的最佳方法](/upload/InfoBanner/zyjiaocheng/753/004c822e269141eb8c174acdeabbc068.jpg)
我有一个嵌套字典树.这是一个小提取物,只是为了给你一个想法:
db = {
'compatibility': {
'style': {
'path_to_file': 'compatibility/render/style.py',
'checksum': {
'0.0.3':'AAA55d796c25ad867bbcb8e0da4e48d17826e6f9fce',
'0.0.2': '55d796c25ad867bbcb8e0da4e48d17826e6f9fe606',}}},
'developer': {
'render': {
'installation': {
'path_to_file': 'developer/render/installation.py',
'checksum': {
'0.0.1': 'c1c0d4080e72292710ac1ce942cf59ce0e26319cf3'}},
'tests': {
'path_to_file': 'developer/render/test.py',
'checksum': {
'0.0.1': 'e71173ac43ecd949fdb96cfb835abadb877a5233a36b115'}}}}}
我想获得嵌套在树中的所有字典模块的列表.这样我就能循环列表并测试每个文件的校验和(注意模块可能处于不同的级别,如上例所示).
为此,我编写了以下递归函数.我知道每个模块都有一个“path_to_file”和“checksum”键,所以我用它来测试dict是否是一个模块.请注意,我必须将递归函数包装在另一个保存列表的函数中,以便每次递归函数运行时都不会覆盖该列表.
def _get_modules_from_db(dictionary):
def recursive_find(inner_dictionary):
for k, v in inner_dictionary.iteritems():
if (isinstance(v, dict) and
not sorted(v.keys()) == ['path_to_file', 'sha512sum']):
recursive_find(v)
else:
leaves.append(v)
leaves = []
recursive_find(dictionary)
return leaves
这种方法有效,但不得不包装该函数对我来说似乎非常难看.那么,我在Stack Overflow上的专业人士的问题:
是否有更简单(或更好)的方法,你建议实现这一点,而不必包装功能?
解决方法:
首先,你需要包装函数的唯一原因是因为你正在使recursive_find就地改变叶子闭包单元而不是返回它.有时这是一个有用的性能优化(尽管经常是一个悲观的),有时它只是不清楚如何做到这一点,但这次它是微不足道的:
def _get_modules_from_db(dictionary):
leaves = []
for k, v in dictionary.iteritems():
if (isinstance(v, dict) and
not sorted(v.keys()) == ['path_to_file', 'sha512sum']):
leaves.extend(_get_modules_from_db(v))
else:
leaves.append(v)
return leaves
为了进一步改进:我可能会把它变成一个发电机(至少在3.3,产量来自;在2.7我可能会三思而后行).而且,当我们在它时,我会将键视图(在3.x中)或set(v)(在2.x中)与集合进行比较,而不是进行不必要的排序(并且没有.keys的原因) ()使用set或sorted),并使用!=而不是和==.并且,除非有充分的理由只接受dict和dict子类,否则我要么使用它或者使用集合.[abc.] Mapping.所以:
def _get_modules_from_db(dictionary):
for k, v in dictionary.items():
if isinstance(v, Mapping) and v.keys() != {'path_to_file', 'sha512sum'}:
yield from _get_modules_from_db(v)
else:
yield v
或者,将基本情况拉出来,这样您就可以直接在字符串上调用它:
def _get_modules_from_db(d):
if isinstance(d, Mapping) and d.keys() != {'path_to_file', 'sha512sum'}:
for v in d.values():
yield from _get_modules_from_db(v)
else:
yield d
我认为这比你的可读性更强一点,它是6行而不是11行(尽管2.x版本将是7行).但是我没有看到你的版本出现任何问题.
如果您不确定如何将3.3代码转换为2.7 / 3.2代码:
>重写鸡蛋的产量和鸡蛋中的鸡蛋:产蛋.
>映射在集合中,而不是collections.abc.
>使用set(v)代替v.keys().
>可能使用itervalues而不是值(仅限2.x).
内容总结
以上是互联网集市为您收集整理的Python中的递归函数:获取特定嵌套项列表的最佳方法全部内容,希望文章能够帮你解决Python中的递归函数:获取特定嵌套项列表的最佳方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。