Sorting a list by the second element
本问题已经有最佳答案,请猛点这里访问。
我正在整理一个由名字和数字组成的列表,在这个例子中是一个人的名字和他们的保龄球得分。我想按字母和数字对列表进行排序。我很难弄清楚如何按数字排序。列表如下所示:"‘安,40’、‘杰夫,250’、‘赞恩,20’"。是否可以对列表中的第二个元素而不是第一个元素使用内置排序函数?
1 2 3 4 5 6 7 8 | #Here is the code l=['Ann, 40', 'Jeff, 250', 'Zane, 20'] l.sort(l[1]) for i in l: print(i) #l.sort(l[1]) does not work |
最终目标是显示
1 2 3 | Jeff, 250 Ann, 40 Zane, 20 |
您可以使用键函数逆序排序,该键函数将每个输入字符串按
1 | l.sort(key=lambda s: int(s.split(', ')[1]), reverse=True) |
1 | ['Jeff, 250', 'Ann, 40', 'Zane, 20'] |
对于我来说,更清洁的方法是:
首先创建一个类来处理对象,然后实现排序、gt和lt所需的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | @dataclass class Person: name: str value: int @classmethod def create_from_str(cls, string): name, value = string.split(",") return cls(name, int(value)) def __gt__(self, other): return self.value > other.value def __lt__(self, other): return self.value < other.value def __repr__(self): return f"{self.name}, {self.value}" l = ['Ann, 40', 'Jeff, 250', 'Zane, 20'] persons = [Person.create_from_str(string) for string in l] persons.sort(reverse=True) print(" ".join(map(str, persons))) # Jeff, 250 # Ann, 40 # Zane, 20 |
此方法提供您请求的输出。
1 2 3 4 5 6 7 8 | l=['Ann, 40', 'Jeff, 250', 'Zane, 20'] l.sort(key = lambda x: int(x.split()[1]), reverse=True) print(*l, sep = ' ') # outputs Jeff, 250 Ann, 40 Zane, 20 |
这个方法短了一行,但它做的是相同的工作。
1 2 3 4 5 6 7 | l=['Ann, 40', 'Jeff, 250', 'Zane, 20'] print(*sorted(l, key = lambda x: int(x.split()[1]), reverse=True),sep =" ") # outputs Jeff, 250 Ann, 40 Zane, 20 |
这里有一个关于使用
拆分列表并在将其转换为列表后对第二个元素排序
1 2 3 4 5 6 7 | l=['Ann, 40', 'Jeff, 250', 'Zane, 20'] l.sort(key = lambda x: int(x.split()[1]), reverse=True) for item in l: print(item) #Jeff, 250 #Ann, 40 #Zane, 20 |