如何按指定列表顺序同步排序两个关联的Python列表?
同步排序关联的Python列表(按指定顺序)
要实现两个关联列表的同步排序,核心是保留元素的对应关系再排序,以下是几种实用方法:
方法1:配对后排序(最直观)
把两个列表的对应元素配对,按weekdays的顺序排序后再拆分回两个列表:
weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] selected_weekdays = ['Friday', 'Monday', 'Thursday'] selected_weekdays_unix = ['8276583', '3724252', '2324626'] # 配对元素并排序 sorted_pairs = sorted(zip(selected_weekdays, selected_weekdays_unix), key=lambda x: weekdays.index(x[0])) # 拆分回两个列表(zip返回元组,可转成list) sorted_days, sorted_unix = map(list, zip(*sorted_pairs)) print(sorted_days) # ['Monday', 'Thursday', 'Friday'] print(sorted_unix) # ['3724252', '2324626', '8276583']
方法2:优化效率(适合大列表)
weekdays.index()每次查找是O(n)复杂度,若weekdays很长,可先建立索引映射字典,把查找效率降到O(1):
# 预建星期到索引的映射字典 weekday_pos = {day: idx for idx, day in enumerate(weekdays)} # 用字典查找替代index方法 sorted_pairs = sorted(zip(selected_weekdays, selected_weekdays_unix), key=lambda x: weekday_pos[x[0]]) sorted_days, sorted_unix = map(list, zip(*sorted_pairs))
方法3:基于索引排序
先获取原列表的排序索引,再用索引提取对应元素:
# 获取排序后的索引顺序 sorted_indices = sorted(range(len(selected_weekdays)), key=lambda i: weekdays.index(selected_weekdays[i])) # 根据索引提取元素 sorted_days = [selected_weekdays[i] for i in sorted_indices] sorted_unix = [selected_weekdays_unix[i] for i in sorted_indices]
为什么你的原代码失败?
你尝试的sorted(selected_weekdays_unix, key=sorted_selected_weekdays.index)逻辑错误:selected_weekdays_unix的元素是字符串数字,而sorted_selected_weekdays是星期名称,调用index()会因找不到元素直接抛出ValueError,且完全没关联两个列表的对应位置关系,自然无法得到正确结果。
内容的提问来源于stack exchange,提问作者Eliahs Johansson
相关产品推荐
相关产品推荐

