【问题标题】:Sort a list in python based on another sorted list根据另一个排序列表对python中的列表进行排序
【发布时间】:2016-04-09 15:22:38
【问题描述】:

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

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

尽管并非所有元素都出现在未排序的列表中,但有没有办法对列表进行排序以反映预排序的列表?

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

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

谢谢!

【问题讨论】:

    标签: python list sorting


    【解决方案1】:
    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 包含不在presorted_list 中的项目(例如'6D'),则上述方法将引发错误。您首先必须决定如何对这些项目进行排序。如果您希望将它们放在列表的末尾,您可以使用

    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']
    

    【讨论】:

    • 对不起,我是新手,但第一段代码似乎给了我未排序列表中第一项的值错误。 ValueError: '6D' 不在列表中
    • 如果项目不在 presorted_list 中,.index 将引发值错误。
    • @Danica:如果您想要删除不在presorted_list 中的项目,请使用sorted(itertools.ifilter(lambda x: x in presorted_list, unsorted_list), key=order.__getitem__) 之类的内容。
    • 该项目是预排序列表的一部分,但它仍然说它不是,我不太清楚为什么。这是未排序的列表: ['8S', 'JD', 'AC', '5C', '8D', '10C'] 这是已排序的列表: ['2C','3C','4C', '5C','6C','7C','8C','9C','10C','JC','QC','KC','AC','2D','3D','4D ','5D','6D','7D','8D','9D','10D','JD','QD','KD','AD','2H','3H', '4H','5H','6H','7H','8H','9H','10H','JH','QH','KH','AH','2S','3S ','4S','5S','6S','7S','8S','9S','10S','JS','QS','KS','AS'] 错误是ValueError: '8S' 不在列表中
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2018-11-15
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2011-03-22
    相关资源
    最近更新 更多