如何使用sorted()依据原列表names的顺序对names_copy排序?
按指定列表顺序排序另一个列表
问题场景
给定两个列表示例:
names = ['Jack', 'Steve', 'Marc', 'Xavier', 'Bob'] names_copy = ['Steve', 'Marc', 'Xavier', 'Bob', 'Jack']
需要将names_copy按照names的现有顺序排序,最终结果为['Jack', 'Steve', 'Marc', 'Xavier', 'Bob']。
限制条件:names_copy是通过map创建的对象,无法使用.sort()方法,但可以使用sorted()函数。
解决方案
利用原列表names中元素的索引位置作为排序依据,给sorted()的key参数指定排序规则即可实现需求。
步骤1:创建元素到索引的映射字典
为了提升查找效率(尤其是列表元素较多时),先把names转换为元素到对应索引的映射:
name_index = {name: idx for idx, name in enumerate(names)}
步骤2:使用sorted()完成排序
直接通过上述字典获取每个元素在原列表中的位置,作为排序的key:
names = ['Jack', 'Steve', 'Marc', 'Xavier', 'Bob'] # 模拟通过map创建的names_copy对象 names_copy = map(str, ['Steve', 'Marc', 'Xavier', 'Bob', 'Jack']) name_index = {name: idx for idx, name in enumerate(names)} sorted_result = sorted(names_copy, key=lambda x: name_index[x]) print(sorted_result) # 输出:['Jack', 'Steve', 'Marc', 'Xavier', 'Bob']
异常处理(可选)
如果names_copy中存在names里没有的元素,直接使用上述代码会抛出KeyError。可以通过dict.get()方法给这类元素指定默认排序位置(比如放到列表末尾):
sorted_result = sorted(names_copy, key=lambda x: name_index.get(x, len(names)))
内容的提问来源于stack exchange,提问作者user20679438
相关产品推荐
相关产品推荐

