我有一个2D列表 -
[('John', 7), ('Max', 10), ('Sarah', 10), ('Tara', 7)]
我希望按数字降序排序(最高的第一个)然后按名称(按字母顺序排序)。
我已使用此代码 -
highestscore = sorted(highestscore, key = lambda x: (x[1],x[0]), reverse=True)
但我得到了结果
[('Sarah', 10), ('Max', 10), ('Tara', 7), ('John', 7)]
有什么想法吗?
答案 0 :(得分:3)
您需要将降序(分数)与升序(名称)混合。您可以使用 - x[1]
代替reverse=True
:
highestscore = sorted(highestscore, key =
lambda x: (int(-x[1]), x[0].lower()))
我还添加了lower()
以使按字母顺序排序不区分大小写。结果是[('Max', 10), ('Sarah', 10), ('John', 7), ('Tara', 7)]
。
答案 1 :(得分:0)
试试这个怎么样:
a = [('John', 7), ('Max', 10), ('Sarah', 10), ('Tara', 7)]
a.sort(key=lambda x: x[0])
a.sort(key=lambda x: x[1], reverse=True)
结果是:
[('Max', 10), ('Sarah', 10), ('John', 7), ('Tara', 7)]
参考:How can I sort tuples by reverse, yet breaking ties non-reverse? (Python)
答案 2 :(得分:0)
你的排序没问题......你需要用地图转换你的元素。
highestscore = sorted(highestscore, key = lambda x: (x[1],x[0]), reverse=True)
scores = [ ( x[ 1 ], x[ 0 ] ) for x in highestscore ]
结果将是
[(10, 'Max'), (10, 'Sarah'), (7, 'John'), (7, 'Tara')]