我似乎无法获得lambda函数来按名称对元组列表进行排序(在按成绩排序之后)。 这是代码:
def sortStudents(a):
sorted(a, key=lambda b: (b[1],str(b[0])))
print(a[::-1])
我正在运行doctest,如果它们具有相同等级,则必须按名称对学生进行排序时失败。它只返回它们而不按名称对它们进行排序。
Expected:
[('Barry Thomas', 88), ('Tim Smith', 54), ('Yulia Smith', 54)]
Got:
[('Barry Thomas', 88), ('Yulia Smith', 54), ('Tim Smith', 54)]
我在这里发现了另一篇文章试图做同样的事情,回答者提出了我做过同样的事情,但它并没有真正起作用。非常感谢任何帮助!
编辑:
这里是doctests:
"""
>>> sortStudents([('Tim Jones', 54), ('Anna Smith', 56), ('Barry Thomas', 88)])
[('Barry Thomas', 88), ('Anna Smith', 56), ('Tim Jones', 54)]
>>> sortStudents([('Tim Smith', 54), ('Anna Smith', 88), ('Barry Thomas', 88)])
[('Anna Smith', 88), ('Barry Thomas', 88), ('Tim Smith', 54)]
>>> sortStudents([('Tim Smith', 54), ('Anna Smith', 54), ('Barry Thomas', 88)])
[('Barry Thomas', 88), ('Anna Smith', 54), ('Tim Smith', 54)]
>>> sortStudents([('Tim Smith', 54), ('Yulia Smith', 54), ('Barry Thomas', 88)])
[('Barry Thomas', 88), ('Tim Smith', 54), ('Yulia Smith', 54)]
"""
答案 0 :(得分:2)
initWithEntity:insertIntoManagedObjectContext不会更改列表,但会返回已排序的列表。将已排序的列表重新分配给a
:
a = sorted(a, key=lambda b: (b[1],str(b[0])))
或者,更好的是,使用列表sorted()
方法对a
就地排序:
a.sort(key=lambda b: (b[1],str(b[0])))
答案 1 :(得分:1)
你把结果扔掉了,并且反应效率低下:
def sortStudents(a):
return sorted(key=lambda b: (b[1], b[0]), reverse=True)
sorted
以排序顺序返回一个迭代,该迭代是传入的可迭代的副本。它不会对传递的列表进行排序。
答案 2 :(得分:0)
您可以使用operator.itemgetter
类。
>>> from operator import itemgetter
>>> arr = [('Barry Thomas', 88), ('Yulia Smith', 54), ('Tim Smith', 54)]
>>> arr.sort(key=itemgetter(1))
>>> arr
[('Barry Thomas', 88), ('Tim Smith', 54), ('Yulia Smith', 54)]
或
>>> arr = sorted(arr, key=lambda b: b[1])
# [('Barry Thomas', 88), ('Tim Smith', 54), ('Yulia Smith', 54)]
你真的不需要将元组中的第二个元素转换为字符串,也可以按第二个元素排序就足够了。