【问题标题】:Python - sorting a list of tuplesPython - 对元组列表进行排序
【发布时间】:2017-09-03 05:45:55
【问题描述】:

我有一个排序算法可以完美地处理数字列表。它从最低到最高排序。我需要修改算法,以便我可以将元组列表设置为参数。

def maxList(A): 
    return(max(num for num in A))
def obtainDigit(num, n): 
    return (num // 10 ** n) % 10
def linkLists(A): 
    lAux = [] 
    for sublist in A: 
        lAux.extend(sublist) 
    return(lAux)
def generateSublists(A, digit): 
    subListsAux = [[] for i in range(255)] 
    for num in A: 
        subListsAux[obtainDigit(num, digit)].append(num) 
    return(subListsAux)
def radixSort(A): 
    iterations = len(str(maxList(A))) 
    for digit in range(iterations): 
        sublists = generateSublists(A, digit) 
        A = linkLists(sublists) 
    return(A)

元组列表实际上是从图像中获取的一组 RGB 值。使用 PIL 我可以获得以下数据: (100,100,100),(255,0,0),(200,200,200),(0,255,0) 排序后,应该是: (0,255,0),(100,100,100),(200,200,200),(255,0,0) 该算法比较每个数字的第一个数字,然后按第一个数字对它们进行排序,然后比较第二个数字。依此类推,直到最后一个数字。所以,不是比较数字,而是比较元组的所有第一个数字,然后是第二个数字,依此类推。

【问题讨论】:

  • 我刚刚看到 sort 属性是如何解决问题的。但是,有没有办法修改上面的算法,以便它也可以解决问题?我真的需要让它与元组一起工作。

标签: python sorting tuples rgb


【解决方案1】:

[算法] 必须比较元组的所有第一个数字,然后是第二个数字,依此类推。

在 Python 中,您可以直接对元组列表进行排序,它的行为与您描述的完全一样:

>>> sorted([(100, 100, 100), (255, 0, 0), (200, 200, 200), (0, 255, 0)])
[(0, 255, 0), (100, 100, 100), (200, 200, 200), (255, 0, 0)]

【讨论】:

    【解决方案2】:

    尝试对列表进行排序的键进行排序。并且还提供了基于元组元素的索引对元组进行排序的便捷方式。
    tup[0] 对第一个元组元素进行排序
    tup[1] 对第二个元素进行排序,依此类推。

    详情请见here

    t =  [(100,100,100),(255,0,0),(200,200,200),(0,255,0) ]
    >>> t.sort(key=lambda tup:tup[0])
    >>> t
    [(0, 255, 0), (100, 100, 100), (200, 200, 200), (255, 0, 0)]
    >>> 
    

    【讨论】:

    • t = [(100,100,100),(255,0,0),(100,100,0),(200,200,200),(0,255,0) ] 将失败,因为您只使用一个属性
    • OP 的要求不明确。我假设他只想要元组的第一个元素,并且也如他的示例中所反映的那样。如果他需要元组的所有索引元素,那么我们可以使用你提到的我知道的方法。
    【解决方案3】:

    你基本上是在寻找多属性排序。

    t =  [(100,100,100),(255,0,0),(100,100,0),(200,200,200),(0,255,0) ]
    
    t1 = sorted(t, key = lambda x: (x[0], x[1], x[2]))
    

    或者你可以使用

    import operator
    t.sort(key = operator.itemgetter(0, 1, 2))
    

    【讨论】:

    • 你的 lambda 只是重新打包输入
    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多