在python中排序列表

Fab*_*ook 1 python sorting

好的,所以我有点问题,我是python的新手抱歉.

我试图按分数排序列表,这是一个数字,但如果有抽奖,我需要按照名称的长度对它们进行排序,名称越短,排名越高.

所以我在这里有这个清单

11 Jenny
8 Adam
10 Mark
8 Ada
Run Code Online (Sandbox Code Playgroud)

当我在这里使用这个代码时,它就会回来了

11 Jenny
10 Mark
10 Mark
10 Mark

def sort(names, counts):
    newArr = []
    newNames = names
    newCount = counts
    for x in range(0, len(names)):
        newArr.append(findBiggest(newNames, newCount))
        for z in range(0, len(names)):
            name = newArr[len(newArr) - 1].split(" ")[1]
            print name 
            if names[z] == name:
                tempArr1 = newNames
                tempArr2 = newCount
                newNames = []
                newCount = []
                for y in range(0, len(tempArr1)):
                    if y != z:
                        newNames.append(tempArr1[y])
                        newCount.append(tempArr2[y])
    return newArr
def findBiggest(names, counts):
    biggest = 0;
    for x in range(0, len(counts)):
        if int(counts[x]) > biggest:
            biggest = int(counts[x])
    biggestCountArr = [[], []]
    for x in range(0, len(counts)):
        if int(counts[x]) == biggest:
            biggestCountArr[0].append(counts[x])
            biggestCountArr[1].append(names[x])
    if len(biggestCountArr[0]) == 1:
        return str(biggestCountArr[0][0]) + " " + biggestCountArr[1][0]
    else:
        return smallestLength(biggestCountArr)
def smallestLength(twoDArr):
    names = twoDArr[1]
    shortestLen = 0
    for x in range(0, len(names)):
        if len(names[x]) > shortestLen:
            shortestlen = len(names[x])
    for x in range(0, len(names)):
        if len(names[x]) == shortestLen:
            return str(twoDArr[0][x]) + " " + twoDArr[1][x]
Run Code Online (Sandbox Code Playgroud)

你知道吗

11 Jenny
8 Adam
10 Mark
8 Ada
Run Code Online (Sandbox Code Playgroud)

应该出来

11 Jenny
10 Mark
8 Ada
8 Adam
Run Code Online (Sandbox Code Playgroud)

mgi*_*son 11

lst=[(11, "Jenny"),(8, "Adam"),(10, "Mark"),(8, "Ada")]
lst.sort(key=lambda x: (-x[0],len(x[1])) )
print (lst) # [(11, 'Jenny'), (10, 'Mark'), (8, 'Ada'), (8, 'Adam')]
Run Code Online (Sandbox Code Playgroud)

list方法sort和builtin函数sorted接受一个key给出可调用的关键字参数.基本上,对于序列中的每个元素,该元素都被传递给key函数,并且该函数的返回值实际上是python在排序时用于确定排序的值.因此,在上面,我lambda用来构造一个从输入元素返回元组的函数.元组是有序的first_element, lenth_of_second_element.

当比较元组(或相关列表)时,它就像比较一个字符串.你看第一个元素,如果它们是相同的,你继续查看第二个元素,然后是第三个元素,依此类推,直到一个元素大于另一个元素.例如

(1,2,3,4) > (1,2,3,3) #True
Run Code Online (Sandbox Code Playgroud)

这最终会以非常有趣的方式进行排序.

我想要解决这个问题,我应该提到python用于排序的算法是稳定的.这意味着如果按keyA排序然后按keyB排序,则基于keyB比较相等的两个元素将保持使用keyA排序后的顺序.换句话说,排序不会改变等值元素的顺序.所以,上面也可以像这样完成:

lst.sort(key=lambda x:len(x[1]))  #sort by length of names
lst.sort(key=lambda x:x[0], reversed=True) #sort by score (highest first instead of regular lowest first)
Run Code Online (Sandbox Code Playgroud)

而且我认为如果没有与更优雅地解释它的东西链接,没有答案是完整的.(具体来说,请参阅"关键功能"部分)

  • @aneroid - 是的,这总是适用于数字输入.如果你没有使用数字输入,你必须依赖python排序稳定并排序两次的事实(一次使用`reversed = True`而一次没有). (2认同)