【问题标题】:Python: Sort list of lists by not one, but two criteriaPython:按不是一个,而是两个标准对列表列表进行排序
【发布时间】:2021-04-23 15:59:51
【问题描述】:

我有一个 Python 排序问题,与我在 stackoverflow 上发现的其他问题类似,但并不完全相同。让我告诉你,也许有人可以帮忙:

假设我们有一个可能看起来像这样的列表:

p = [[6, 'k'], [5, 'l'], [2, 'p'], [2, 'd'], [5, 'k']]

我想按两个 (!) 标准对此进行排序。按一个标准对其进行排序是相当容易和直接的。假设我想首先按每个列表的第一项对其进行排序。我可以这样实现:

sorted_p = sorted(p, key=lambda x:int(x[0]))

到目前为止一切顺利。我会得到以下 sorted_p:

[[2,'p'], [2, 'd'], [5, 'l'], [5, 'k'], [6, 'k']]

现在真正的麻烦开始了:我希望在第一项多次出现的情况下(例如,我们有两个以 2 开头的元组和两个以 5 开头的元组),然后这些元组按第二项排序的元组。所以我想得到的结果是

[[2,'d'], [2, 'p'], [5, 'k'], [5, 'l'], [6, 'k']]

有人知道我该怎么做吗?

感谢您的每一个提示!

【问题讨论】:

  • 又快又脏的可能是key=lambda x: 1000 * x[0] + ord( x[1] )
  • ...或者看here
  • 对不起,我应该解释一下,这些只是示例值。很可能第一项是字母或句子,第二项是浮动的或其他东西。所以我需要一种相当通用的方法来解决这个问题,而不是一种快速而肮脏的方法。不过还是谢谢
  • 嘿,链接看起来很有希望!午饭后我会潜入它:)
  • 谢谢@mikuszefski,链接效果很好!

标签: python arrays list sorting


【解决方案1】:

如果你传递一个元组,Python 会自动按超过 1 个条件排序。在您的情况下,它将是:

p = [[6, 'k'], [5, 'l'], [2, 'p'], [2, 'd'], [5, 'k']]
sorted_p = sorted(p, key=lambda x:(int(x[0]),x[1]))

【讨论】:

  • 非常感谢,@Advay168。这工作得很好,我很高兴我学到了一些新东西!
【解决方案2】:

接受的答案很棒。在自定义的情况下,只需添加另一个答案而不使用内置排序即可扩展。

def custom_bubble_sort(arr):
    for i in range(len(arr)-1):
        for j in range(len(arr)-i-1):
            if arr[j][0] > arr[j+1][0]:
                temp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = temp
            elif arr[j][0] == arr[j+1][0] and ord(arr[j][1]) > ord(arr[j+1][1]):
                    temp = arr[j]
                    arr[j] = arr[j+1]
                    arr[j+1] = temp
    return arr

print(custom_bubble_sort([[6, 'k'], [5, 'l'], [2, 'p'], [2, 'd'], [5, 'k']]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2011-07-09
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多