我正在尝试对这些元组列表进行排序:
[('Pineapple', 1), ('Orange', 3), ('Banana', 1), ('Apple', 1), ('Cherry', 2)]
排序列表应为:
[('Orange', 3), ('Cherry', 2), ('Apple', 1), ('Banana', 1), ('Pineapple', 1)]
因此,首先,列表应按tuple[1]
降序排序,如果tuple
值(tuple[1]
)与Apple
匹配,{{{ 1}}& Banana
- 列表应根据Pineapple
按升序进一步排序。
我尝试过可能的方法 -
tuple[0]
为top_n.sort(key = operator.itemgetter(1, 0), reverse = True)
# Output: [(Orange, 3), (Cherry, 2), (Pineapple, 1), (Banana, 1), (Apple, 1)]
,菠萝,香蕉,......
我最终不得不想出一个解决方案:
"reverse = True"
有没有更好的方法来获得解决方案,就像我的第一种方法一样。我正在尝试更多地探索Python,从而寻求这种解决方案。
答案 0 :(得分:13)
让你的密钥返回数值否定的元组,然后是字符串。通过否定,您的数字将按降序排序,而字符串按升序排序:
top_n.sort(key=lambda t: (-t[1], t[0]))
是的,这有点像黑客攻击,但可以在任何需要按相反方向按两个标准排序的地方工作,其中一个标准是数字。
演示:
>>> top_n = [('Pineapple', 1), ('Orange', 3), ('Banana', 1), ('Apple', 1), ('Cherry', 2)]
>>> sorted(top_n, key=lambda t: (-t[1], t[0]))
[('Orange', 3), ('Cherry', 2), ('Apple', 1), ('Banana', 1), ('Pineapple', 1)]
答案 1 :(得分:2)
在你的情况下,Martijn Pieters解决方案可能是最好的,但我正在考虑如果你需要为任意数量的参数执行此操作,并且需要做一些提升和一些降序。
此方法创建一个动态生成排序索引的函数。使用要排序的元组列表调用getsortfunction和包含索引的列表以及它们是否应按相反的顺序排列(例如(2,True)
表示反向顺序的第二个索引),返回一个为对象创建排序索引的函数。这是非常丑陋,但多才多艺。
def getsortfunction(values,indices):
sorts = [sorted(list(set(x[indices[i][0]] for x in values)),reverse=indices[i][1]) for i in range(len(indices))]
def sortfunction(y):
return tuple(sorts[i].index(y[indices[i][0]]) for i in range(len(indices)))
return sortfunction
实施例
a = [('Pineapple',1),('Orange',3),('Banana',1),('Apple',1),('Cherry',2)]
# sort a by index 1 first (in reverse order) and then by index 0 in non-reverse order
b = sorted(a,key=getsortfunction(a,[(1,True),(0,False)])) # gives desired list
附加标准
c = [('Pineapple',1,'Hawaii'),('Orange',3,'Florida'),('Banana',1,'Hawaii'),('Apple',1,'Washington'),('Cherry',2,'Washington')]
# sort first by number (in reverse order) then by state, and finally by fruit
d = sorted(c,key=getsortfunction(c,[(1,True),(2,False),(0,False)]))
# sort c first by number (in reverse order), then by fruit, ignoring state
e = sorted(c,key=getsortfunction(c,[(1,True),(0,False)]))
getortfunction首先按顺序构建一个嵌套的唯一值列表,并返回一个函数,该函数将要排序的每个值映射到数字元组,并在排序值列表中给出其索引。
这样做的最大优点是您可以在运行时确定排序条件(例如来自用户请求)。