10

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

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

(可以很长)

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

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

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

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

4

2 回答 2

18

最有效的方法是创建从单词到顺序的映射:

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

于 2013-08-02T12:27:39.307 回答
4

最短的解决方案:

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

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

回报:

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

仅当项目包含在测试中时,才会按该顺序显示来自 lst 的所有项目。优点:不需要排序。

评论后:

缺点: - 可能不会显示重复项 - 'in' 运算符表示遍历;和第二个一样。因此,如果列表很长,则可能效率低下。然而,来自 Martijn 的解决方案也有两种,所以我不能轻易决定哪种更有效。

于 2013-08-02T12:29:52.300 回答