我有一个预定义的列表,表示某些值的顺序:
['id','name','age','height','weight',]
(可能很长)
我想对此列表的任何子集进行排序:
所以,如果我得到['height','id']
它将成为['id','height']
或['name','weight','height']
---> ['name','height','weight']
是否有某种方法可以使用sort
函数以某种方式使用key
参数执行此操作?或者我应该使用自定义方法,如果是这样,最有效的方法是什么?
答案 0 :(得分:16)
最有效的方法是按字母顺序创建地图:
ordering = {word: i for i, word in enumerate(predefined_list)}
然后在排序中使用该映射:
somelist.sort(key=ordering.get)
另一种方法是使用列表中的.index()
来扫描列表,并在排序时找到每个单词的索引:
somelist.sort(key=predefined_list.index)
但这与使用ordering
词典的几乎一样高效。
演示:
>>> predefined_list = ['id','name','age','height','weight',]
>>> ordering = {word: i for i, word in enumerate(predefined_list)}
>>> sorted(['height','id'], key=ordering.get)
['id', 'height']
>>> sorted(['name','weight','height'], key=ordering.get)
['name', 'height', 'weight']
如果预定义列表中的任何值不唯一,则这两种方法将导致不同的排序顺序。 .index()
方法使用第一次出现的值作为排序值,字典方法将使用最后一个值。有很多方法,你可以使字典方法处理列表和反向索引,例如。
答案 1 :(得分:4)
最短的解决方案:
lst = ['id', 'name', 'age', 'height', 'weight',]
test = ['name', 'weight', 'height']
print [word for word in lst if word in test]
返回:
['name', 'height', 'weight']
仅当项目包含在测试中时,才显示该命令中的所有项目。 优点:无需分类。
评论后:
缺点: - 可能不会显示重复项 - 'in'运算符意味着遍历;与第二个相同。因此,如果列表很长,则可能效率低下。然而,Martijn的解决方案也有两种,所以我无法轻易决定哪种更有效。