Python如何按自定义规则排序字典列表提取的唯一键
Python字典提取键的自定义排序实现
你从venues列表提取所有字典唯一键时用了集合推导式,Python中集合是无序结构,所以得到的键列表顺序随机,要按照指定顺序排序可以直接用列表自带的排序方法,传入自定义排序规则即可。
方法1:索引映射法(推荐,效率高)
提前把目标顺序转成「键-排序位置」的字典,排序时直接查对应位置作为排序依据,适合数据量较大的场景:
venues =[{'capacity': 700, 'id': 1, 'name': 'AMD'}, {'capacity': 2000, 'id': 2, 'name': 'Honda'}, {'capacity': 2300, 'id': 3, 'name': 'Austin Kiddie Limits'}, {'capacity': 2000, 'id': 4, 'name': 'Austin Ventures'}] # 定义期望的键顺序 sorted_keys = ['id','name','capacity'] # 生成排序优先级映射,索引越小排序越靠前 order_index = {key: idx for idx, key in enumerate(sorted_keys)} # 提取所有唯一键 b = list({k for d in venues for k in d.keys()}) # 按自定义规则排序 b.sort(key=lambda k: order_index[k])
执行后b的输出固定为['id', 'name', 'capacity'],符合预期。
如果后续字典可能出现未在sorted_keys中预定义的新键,可以给映射加默认值,把未知键统一放到列表末尾:
b.sort(key=lambda k: order_index.get(k, float('inf')))
方法2:index直接取值(适合小数据量场景)
如果提取的键数量很少,不需要考虑排序效率,可以直接传入目标列表的index方法作为排序依据,写法更简洁:
sorted_keys = ['id','name','capacity'] b = list({k for d in venues for k in d.keys()}) b.sort(key=sorted_keys.index)
注意:这个方法每次排序比较时都会遍历sorted_keys查找索引,键的数量较多时性能会明显下降。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

