好的,所以我有点问题,我是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
答案 0 :(得分: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')]
列表方法sort
和内置函数sorted
接受一个可调用的关键字参数key
。基本上,对于序列中的每个元素,该元素都被传递给key
函数,并且该函数的返回值实际上是python在排序时用于确定排序的值。因此,在上面,我使用lambda
来构造一个从输入元素返回元组的函数。元组是按first_element, lenth_of_second_element
排序的。
当比较元组(或相关列表)时,它就像比较一个字符串。你看第一个元素,如果它们是相同的,你继续查看第二个元素,然后是第三个元素,依此类推,直到一个元素大于另一个元素。 e.g。
(1,2,3,4) > (1,2,3,3) #True
这最终会以非常有趣的方式进行排序。
我想要解决这个问题,我应该提到python用于排序的算法是 stable 。这意味着如果按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更优雅的话,没有答案是完整的。 (具体来说,请参阅“关键功能”部分)
答案 1 :(得分:0)
您必须遍历每一行并在其上使用sort
方法
#open the file and read through the lines.
lines = open('yourfile.txt').readlines()
#iterate over each line, and split along the spaces
pairs =[]
for line in lines:
split_string = line.split('')
num = int(split_string[0])
pairs.append((num, split_string[1:])
#sort through the pairs (from mgilsons answer)
pairs.sort(key=lambda x: (x[0],len(x[1]))
编辑:实际上误读了这个问题。
答案 2 :(得分:0)
aList = [
(11, 'Jenny'),
(8, 'Adam'),
(10, 'Mark'),
(8, 'Ada'),
]
aList.sort(lambda x, y: y[0] - x[0])
print aList