使用lambda表达式无法正常排序元组中的名称

时间:2015-11-15 18:30:35

标签: python sorting lambda

我似乎无法获得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)]

"""

3 个答案:

答案 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)]

你真的不需要将元组中的第二个元素转换为字符串,也可以按第二个元素排序就足够了。