gpt4 book ai didi

python - 在 python 中排序列表

转载 作者:太空宇宙 更新时间:2023-11-04 06:56:54 25 4
gpt4 key购买 nike

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

我正在尝试按分数对列表进行排序,分数是一个数字,但是如果有平局,我需要按名字的长度对它们进行排序,名字越短排名越高。

所以我这里有这个列表

11 Jenny
8 Adam
10 Mark
8 Ada

当我在这里使用这段代码时,它会返回

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]

让你知道

11 Jenny
8 Adam
10 Mark
8 Ada

应该是

11 Jenny
10 Mark
8 Ada
8 Adam

最佳答案

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

列表方法 sort 和内置函数 sorted 接受一个关键字参数 key ,它被赋予一个可调用对象。基本上,对于序列中的每个元素,该元素都会传递给 key 函数,而该函数的返回值实际上是 python 在排序时用来确定顺序的值。因此,在上面,我使用 lambda 构造一个从输入元素返回元组的函数。元组是有序的 first_element, lenth_of_second_element

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

(1,2,3,4) > (1,2,3,3) #True

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

我想总结一下,我应该提到 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)

我想没有 link to something which explains it 的答案是不完整的更优雅。 (具体见“按键功能”部分)

关于python - 在 python 中排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11732133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com