Python - 对元组列表进行排序

4
我有一个完美的适用于数字列表的排序算法,可以将数字从小到大排序。现在我需要修改这个算法,使其能够接受元组列表作为参数。
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属性是如何解决这个问题的。但是,有没有一种方法可以修改上面的算法,使其也能解决这个问题呢? 我真的需要让它能够处理元组。 - Cotton-Eye Joe
3个回答

4
[该算法] 必须先比较所有元组的第一个数字,然后是第二个数字,以此类推。在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)]

1
尝试使用按键排序,这会就地对列表进行排序。同时还提供了一种方便的方式来根据元组元素的索引对元组进行排序。
例如,tup [0] 可以按照第一个元素对其进行排序,tup [1] 可以按照第二个元素进行排序,以此类推。请参见此处获取详细信息。
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)] - Tarun Lalwani
OP的需求不是很清楚。我假设他只想要元组的第一个元素,就像他的示例中所反映的那样。如果他需要元组的所有索引元素,那么我们可以使用您提到的方法,这是我知道的。 - Anil_M

-1

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

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 只是重新打包输入。 - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接