按键排序2D列表

时间:2015-02-11 12:23:32

标签: python list sorting

我有一个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)]

有什么想法吗?

3 个答案:

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