按多列排序时,为每列设置升序降序

时间:2018-07-09 19:22:37

标签: python list sorting

我有一个列表--account我想排序。我首先按第一列排序。如果有关系,那么我继续使用第二列进行排序。假设我想按升序按第一列排序,但按降序按第二列排序。升为默认值,使用d键,我认为以下内容应能工作。

reverse

但事实并非如此。它给出了以下错误。

sorted(d,key=lambda x: (x[0],x[1]),reverse=(False,True))

因此,如果我没有正确执行操作,该如何解决?还是这样做的方式完全不同?对此的建议会有所帮助。

我的问题确实存在重复,但已经有有趣的回答,因此我想保留它。

3 个答案:

答案 0 :(得分:3)

可能会过大,但是.. )使用pandas和args ascending=[True, False]

d = [[1,2], [2,2], [2,3], [2,4], [3,1]]
df=  pd.DataFrame(d)

sorted_values = df.sort_values(by=[0,1], ascending=[True,False])
sorted_list = sorted_values.agg(list,1).tolist()

[[1, 2], [2, 4], [2, 3], [2, 2], [3, 1]]

答案 1 :(得分:1)

来自docs

  

reverse 是一个布尔值。如果设置为True,则对列表元素进行排序,就好像每个比较都被反转一样。

所以您想要的是类似的东西:

d.sort(key=lambda x: (x[0], -x[1]))

如果x[1]不是数字,请尝试:

d.sort(key=lambda x: x[1], reverse=True)
d.sort(key=lambda x: x[0])

答案 2 :(得分:1)

我的解决方案:

from itertools import groupby, chain

l = ((1, 'b'),
     (1, 'd'),
     (2, 'a'),
     (1, 'a'))

def sort_multi(lst, index_normal, index_reversed):
    return list(chain.from_iterable([sorted(list(j), key=lambda v:v[index_reversed], reverse=True) for i, j in groupby(sorted(lst), key=lambda v:v[index_normal])]))


print(sort_multi(l, 0, 1))

输出:

[(1, 'd'), (1, 'b'), (1, 'a'), (2, 'a')]