Dan*_*des 5 python sorting list
我想基于预先排序的列表在Python中对列表进行排序
presorted_list = ['2C','3C','4C','2D','3D','4D']
unsorted_list = ['3D','2C','4D','2D']
Run Code Online (Sandbox Code Playgroud)
有没有办法对列表进行排序以反映预先排序的列表,尽管事实并非排序列表中不存在所有元素?
我希望结果看起来像这样:
after_sort = ['2C','2D','3D','4D']
Run Code Online (Sandbox Code Playgroud)
谢谢!
In [5]: sorted(unsorted_list, key=presorted_list.index)
Out[5]: ['2C', '2D', '3D', '4D']
Run Code Online (Sandbox Code Playgroud)
或者,为了获得更好的性能(特别是在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']
Run Code Online (Sandbox Code Playgroud)
有关如何使用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']
Run Code Online (Sandbox Code Playgroud)
或者如果您希望将这些项目放在列表的前面,请使用
In [12]: sorted(unsorted_list, key=lambda x: order.get(x, -1))
Out[12]: ['6D', '2C', '2D', '3D', '4D']
Run Code Online (Sandbox Code Playgroud)