我需要完成一项任务,我会得到每个名字的名单和成绩列表,我需要按照从最高到最低的等级排序。但是,如果两个名称具有相同的等级,则按字母顺序对这些名称进行排序。这是我提出的问题。我需要将排序功能保持在一行。
a = [('Tim Jones', 54), ('Anna Smith', 56), ('Barry Thomas', 88)]
sum(sorted(a,key=lambda x: x[1]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
关于如何解决这个问题的任何想法?我已经尝试了很多天了。
已更新
好的,谢谢你帮我解决了这个问题,但还有另外一个场景我需要解决。
a = [('Tim Jones', 'C'), ('Anna Smith', 'B'), ('Barry Thomas', 'A')]
sorted(a,key=lambda x: -x[1])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
TypeError: bad operand type for unary -: 'str'
所以现在的情况基本上我现在需要做的就是组织清单,然后从最高等级到最低等级。
答案 0 :(得分:2)
sorted()函数返回一个元组列表。所以你不能总结它们,因为sum()假设接收一系列数字。
第二个是因为你在x [1]之前有一个减号( - ),而x [1]是一个字符串。你不能有负字符串。
>>> a = [('Tim Jones', 'C'), ('Anna Smith', 'B'), ('Barry Thomas', 'A')]
>>> sorted(a,key=lambda x: x[1])
如果您希望在成绩相同时按字母顺序对这些名称进行排序,请使用元组(x [1],x [0])作为排序键。
>>> a = [('Tim Jones', 54), ('Anna Smith', 56), ('Barry Thomas', 88),('Array Thomas', 88)]
>>> sorted(a,key=lambda x: (x[1],x[0]))
[('Tim Jones', 54), ('Anna Smith', 56), ('Array Thomas', 88), ('Barry Thomas', 88)]
答案 1 :(得分:1)
请注意sorted()
将返回原始列表的副本,但已排序:
>>> a = [('Tim Jones', 54), ('Anna Smith', 56), ('Barry Thomas', 88)]
>>> sorted(a,key=lambda x: x[1])
[('Tim Jones', 54), ('Anna Smith', 56), ('Barry Thomas', 88)]
Python试图对这三个元组求和时本身会失败,因为它没有任何明确的含义。
('Tim Jones', 54)
('Anna Smith', 56)
('Barry Thomas', 88)