如何在字典中按多键同步排序列表(类似pandas.sort_values)
多关键字同步排序字典中的等长列表
这是个很常见的需求,不用pandas完全可以搞定,核心是利用Python的zip和sorted配合来实现多字段的同步排序,我来给你拆解一下具体步骤:
核心思路
要同步排序字典里的所有列表,关键是先把同一索引位置的所有元素打包成元组,这样每个元组就代表一条完整的"记录";然后按照你指定的优先级(先Range,再Strength)对这些记录排序;最后再把排序后的记录拆分成单独的列表,重新赋值给字典的对应键。
具体实现代码
针对你的特定字典(手动指定字段)
先看最直接的写法,适合字段少的情况:
# 原字典 d = {'Name': ['archer', 'warrior', 'wizard', 'spearman'], 'Range': [10, 2, 10, 3], 'Strength': [4, 6, 8, 5]} # 1. 把所有列表的对应元素打包成元组(每条元组是一条完整记录) rows = list(zip(d['Name'], d['Range'], d['Strength'])) # 2. 按Range升序、再按Strength升序排序 # 排序key先取元组的第2个元素(Range),再取第3个元素(Strength) rows_sorted = sorted(rows, key=lambda x: (x[1], x[2])) # 3. 拆分排序后的元组,重新赋值给字典 d['Name'], d['Range'], d['Strength'] = zip(*rows_sorted) # 可选:把zip返回的元组转成列表(如果需要保持原字典的值为列表类型) d = {key: list(value) for key, value in d.items()} # 验证结果 print(d)
执行后输出完全符合你的期望:
{'Name': ['warrior', 'spearman', 'archer', 'wizard'], 'Range': [2, 3, 10, 10], 'Strength': [6, 5, 4, 8]}
通用版(适配任意多字段的字典)
如果你的字典有更多字段,不想手动逐个写,可以用更灵活的写法,自动适配所有键:
d = {'Name': ['archer', 'warrior', 'wizard', 'spearman'], 'Range': [10, 2, 10, 3], 'Strength': [4, 6, 8, 5]} # 获取字典的所有键,保持顺序 keys = list(d.keys()) # 打包所有字段的对应元素 rows = list(zip(*d.values())) # 按指定的关键字排序:先Range,再Strength # 通过keys.index()找到对应字段在元组中的位置 rows_sorted = sorted(rows, key=lambda x: (x[keys.index('Range')], x[keys.index('Strength')])) # 拆分排序后的记录,重新构建字典 d = {k: list(v) for k, v in zip(keys, zip(*rows_sorted))}
这个写法不管字典有多少个字段,只要指定好排序的关键字,就能自动同步排序所有列表。
补充说明
- 如果需要降序排序,可以在排序key的对应字段前加负号,比如
key=lambda x: (-x[1], x[2])就是Range降序、Strength升序。 zip(*rows_sorted)是Python的"解包"操作,能把排序后的元组列表重新拆分成多个独立的迭代器,正好对应原来的各个字段。
内容的提问来源于stack exchange,提问作者Alehud
相关产品推荐
相关产品推荐

