繁体   English   中英

基于键排序列表的python排序列表

[英]python sort list based on key sorted list

我有一个预定义的列表,表明一些值的顺序:

['id','name','age','height','weight',]

(可能很长)

我想对此列表的任何子集进行排序:

所以,如果我得到['height','id']它会变成['id','height']

['name','weight','height'] ---> ['name','height','weight']

是否有某种方法使用key参数以某种方式使用sort函数? 或者我应该使用自定义方法,如果是这样,最有效的方法是什么?

最有效的方法是从一个单词到另一个单词创建一个地图:

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()方法使用第一次出现的值作为排序值,字典方法将使用最后一个值。 有很多方法,例如,您可以使字典方法处理列表和反向索引。

最短的解决方案:

lst  = ['id', 'name', 'age', 'height', 'weight',]
test = ['name', 'weight', 'height']

print [word for word in lst if word in test]

返回:

['name', 'height', 'weight']

仅当项目包含在测试中时,才会以该顺序显示lst中的所有项目。 优点:无需分类。

评论后:

缺点: - 可能不会显示重复项 - “输入”运算符表示遍历; 与第二个相同。 因此,如果列表很长,则可能效率低下。 然而,Martijn的解决方案也有两种,所以我不能轻易地决定哪种更有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM