根据另一个排序列表在python中对列表进行排序


问题内容

我想根据预排序列表在Python中对列表进行排序

presorted_list = ['2C','3C','4C','2D','3D','4D']
unsorted_list = ['3D','2C','4D','2D']

尽管并非所有元素都存在于未排序列表中,但是否有一种方法可以对列表进行排序以反映预排序列表?

我希望结果看起来像这样:

after_sort = ['2C','2D','3D','4D']

谢谢!


问题答案:
In [5]: sorted(unsorted_list, key=presorted_list.index)
Out[5]: ['2C', '2D', '3D', '4D']

或者,为了获得更好的性能(尤其是在len(presorted_list)较大的情况下),

In [6]: order = {item:i for i, item in enumerate(presorted_list)}    
In [7]: sorted(unsorted_list, key=order.__getitem__)
Out[7]: ['2C', '2D', '3D', '4D']

有关如何使用keys进行排序的更多信息,请参见出色的Howto Sort
Wiki


如果unsorted_list包含的项目(例如'6D')不在中,presorted_list则上述方法将引发错误。您首先必须决定如何对这些项目进行排序。如果要将它们放在列表的末尾,可以使用

In [10]: unsorted_list = ['3D','2C','6D','4D','2D']

In [11]: sorted(unsorted_list, key=lambda x: order.get(x, float('inf')))
Out[11]: ['2C', '2D', '3D', '4D', '6D']

或者如果您希望将此类项目放在列表的最前面,请使用

In [12]: sorted(unsorted_list, key=lambda x: order.get(x, -1))
Out[12]: ['6D', '2C', '2D', '3D', '4D']