在Python

时间:2016-01-14 07:53:11

标签: python list sorting

我正在尝试对这些元组列表进行排序:

[('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,从而寻求这种解决方案。

2 个答案:

答案 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首先按顺序构建一个嵌套的唯一值列表,并返回一个函数,该函数将要排序的每个值映射到数字元组,并在排序值列表中给出其索引。

这样做的最大优点是您可以在运行时确定排序条件(例如来自用户请求)。