Python中如何解构长度为1的字典 将键和值分别赋值给两个变量
单键值对字典提取键、值的实现方案
你当前使用的k, v = list(d.items())[0]可以正常工作,但存在不必要的列表生成开销,有两种更简洁的写法可以根据场景选择:
- 允许修改原字典的场景:直接使用
dict.popitem()
Python 3.7及以上版本字典默认保留插入顺序,对于长度为1的字典,popitem()会直接返回唯一的键值对元组,不需要额外做类型转换,写法最简洁:
注意:该方法会原地删除字典内的这个键值对,如果你后续不需要复用原字典,这是性能最优的写法。你贴出的目录遍历代码中,处理单键d = {'a': 0} assert len(d) == 1 k, v = d.popitem()folder['folders']的逻辑已经在使用这个方法,完全可以在其他同类场景直接复用。 - 不允许修改原字典的场景:使用迭代器直接取首个元素
不需要将d.items()转为完整列表,直接生成迭代器取第一个元素即可,不会修改原字典,也不会产生多余的临时列表:
这是只读场景下的最优实现。k, v = next(iter(d.items()))
目录递归折叠逻辑的优化建议
你当前实现中先生成完整嵌套结构、再二次遍历删除空目录、折叠单嵌套层级的逻辑可以进一步简化:在递归返回结果时就做空目录过滤、单层级折叠,从根源上避免生成多余的嵌套结构,省去后续遍历调整的步骤:
- 空目录直接返回
None,上层递归收到None时不加入folders集合,不需要后续再执行pop删除空目录的操作 - 当当前目录没有文件、且仅包含1个子目录时,直接将当前目录名和子目录路径拼接后返回,不需要生成一层新的字典嵌套
简化后的参考实现如下:
from pathlib import Path def recur_dir(path, root=None): path = Path(path) top_level = False if root is None: assert path.is_dir() root = path top_level = True files = [] folders = {} for element in path.iterdir(): if element.is_file(): files.append(element.name) elif element.is_dir(): sub_result = recur_dir(element, root) if sub_result: folders.update(sub_result) # 空目录直接返回空 if not files and not folders: return None # 折叠仅含单个子目录的无文件嵌套 if not files and len(folders) == 1: k, v = next(iter(folders.items())) if top_level: return {str(path): v} merged_key = f"{path.name}/{k}" return {str(Path(merged_key).relative_to(root)).replace('\\', '/'): v} report = {} if files: report['files'] = files if folders: report['folders'] = folders if top_level: return {str(path): report} return {str(path.relative_to(root)).replace('\\', '/'): report}
内容的提问来源于stack exchange,提问作者Ξένη Γήινος
相关产品推荐
相关产品推荐

