use*_*011 5 python sorting import tuples list
有点蟒蛇新手,但我得到了以下的元组列表.我需要按值对其进行排序,如果值相同,则按字母顺序求解关系.这是一个示例:
#original
list_of_medals = [('Sweden', 24), ('Germany', 16), ('Russia', 10), ('Ireland', 10), ('Spain', 9), ('Albania', 8), ('Lithuania', 7), ('Iceland', 6), ('Malta', 5), ('Italy', 5), ('Serbia', 4), ('Estonia', 4), ('Turkey', 4), ('Moldova', 2), ('Azerbaijan', 2)]
# \____/ \_____/ \______/
#after sorting / \ / \ / \
sorted_medals = [('Sweden', 24), ('Germany', 16), ('Ireland', 10), ('Russia', 10), ('Spain', 9), ('Albania', 8), ('Lithuania', 7), ('Iceland', 6), ('Malta', 5), ('Italy', 5), ('Estonia', 4), ('Serbia', 4), ('Turkey', 4), ('Azerbaijan', 2), ('Moldova', 2)]
Run Code Online (Sandbox Code Playgroud)
是否可能使用该operator模块?
NPE*_*NPE 11
在这个例子中,我使用lambda函数作为/ 的key参数:sort()sorted()
In [59]: sorted(list_of_medals, key=lambda x:(-x[1],x[0]))
Out[59]:
[('Sweden', 24),
('Germany', 16),
('Ireland', 10),
('Russia', 10),
('Spain', 9),
('Albania', 8),
('Lithuania', 7),
('Iceland', 6),
('Italy', 5),
('Malta', 5),
('Estonia', 4),
('Serbia', 4),
('Turkey', 4),
('Azerbaijan', 2),
('Moldova', 2)]
Run Code Online (Sandbox Code Playgroud)
的否定x[1]是需要在奖牌排序递减顺序而排序的国名升序的顺序(简单的设置reverse=True就不会做到这一点).
正如几位人士在评论中指出的那样,对复合键进行复杂排序的更通用方法是执行多个排序步骤.要执行此操作,请一次对一个组件进行排序,从最不重要的组件开始:
In [67]: temp = sorted(list_of_medals, key=itemgetter(0))
In [68]: sorted(temp, key=itemgetter(1), reverse=True)
Out[68]:
[('Sweden', 24),
('Germany', 16),
('Ireland', 10),
('Russia', 10),
...
Run Code Online (Sandbox Code Playgroud)
这取决于Python的排序是稳定的,这意味着比较相等的项永远不会重新排序.
您可以使用以下sorted功能:
sorted_by_medals = sorted(list_of_medals, key=lambda tup: (-tup[1], tup[0]))
Run Code Online (Sandbox Code Playgroud)