2014-11-22 82 views
2

我创建了一个包含多个项目的列表。按价值排序Python中的多个项目列表

例如:

highScoreList = [["Dummy1",40,50],["Dummy2",100,80],["Dummy3",100,90]] 

我试图理清此基础上值。首先它应该按最大的第二个值排序(这里:100大于40)。

如果有一些元素具有相同的第二个元素(这里是:100和100),我仍然想使用第三个元素对它们进行排序。第三个元素越小,应该排名越高(这里:80小于90)。

结果应该是:

Dummy2 100 
Dummy3 100 
Dummy1 40 

我只使用1个分值写了一些类似的代码,在过去的一组。

def printHighScoreList(): 
    descender = ((key,highScoreList[key]) for key in sorted(highScoreList,key=highScoreList.get, reverse=True)) 
    for key, value in descender: 
     print(key, value) 
+1

这不是一套。这是一个列表清单。集合用大括号表示:'{1,2,3}'。 – iCodez 2014-11-22 16:56:41

+0

@iCodez你完全正确。对不起,我很困惑。更新我的问题。谢谢! – 2014-11-22 17:07:26

回答

1

使用复合键进行排序。

highScoreList.sort(key=lambda x: (-x[1], x[2])) 

highScoreList现在进行排序正确:既然你想在基于第一指数反向排序列表清单,同时采用第二个索引是反转的第一个索引键

[['Dummy2', 100, 80], ['Dummy3', 100, 90], ['Dummy1', 40, 50]] 

虽然来自@ BHATIRSHAD的答案的双重排序方法需要3.39us(在我的机器上用于10k循环的列表中),但上述方法仅需1.5us。

2

排序列表中第三元件上按升序排列,然后在排序基于该列表的第二元件上decending顺序结果的列表。演示:

>>> highScoreList = [["Dummy1",40,50],["Dummy2",100,80],["Dummy3",100,90]] 
>>> sorted(sorted(highScoreList, key=lambda x:x[2]),key=lambda x:x[1],reverse=True) 
[['Dummy2', 100, 80], ['Dummy3', 100, 90], ['Dummy1', 40, 50]]