如何按指定列表顺序匹配输出字典列表?避免多层for循环实现
按指定列表顺序排序字典列表,避免多层循环
给定列表:
arr = ["rajab", "vedanth", "chinmay", "vignesh"]
以及字典列表:
elements = [ { 'name': 'vedanth', 'age': 17, 'time_hours': 1}, { 'name': 'rajab', 'age': 12, 'time_hours': 3}, { 'name': 'vignesh', 'age': 21, 'time_hours': 2.5}, { 'name': 'chinmay', 'age': 24, 'time_hours': 1.5}, ]
需要按照arr中的顺序,重新排列elements里的字典条目,预期输出:
elements = [ { 'name': 'rajab', 'age': 12, 'time_hours': 3}, { 'name': 'vedanth', 'age': 17, 'time_hours': 1}, { 'name': 'chinmay', 'age': 24, 'time_hours': 1.5}, { 'name': 'vignesh', 'age': 21, 'time_hours': 2.5} ]
请问如何避免使用多层for循环实现该需求?
解决方案:字典映射+列表推导式
用字典做一次映射就能高效完成排序,完全避免嵌套循环,具体实现如下:
代码实现
# 构建name到对应字典的映射表 name_to_element = {item['name']: item for item in elements} # 按arr的顺序提取对应元素 sorted_elements = [name_to_element[name] for name in arr] # 打印结果 print(sorted_elements)
原理说明
- 先遍历一遍
elements,把每个字典用它的name字段作为键存入映射字典,这样后续查找某个name对应的字典只需要O(1)时间,不用再循环整个列表。 - 再遍历
arr,按顺序从映射字典里取出对应条目,组成新列表就是最终的排序结果。 - 整体只需要两次线性遍历,时间复杂度是O(m+n)(m是
elements长度,n是arr长度),比嵌套循环的O(m*n)效率高很多。 - 如果
arr里存在elements中没有的名字,直接取值会触发KeyError,可以用name_to_element.get(name)替代,不存在时会返回None,也可以自定义默认值(比如name_to_element.get(name, {}))。
内容的提问来源于stack exchange,提问作者Rad4
相关产品推荐
相关产品推荐

