设为升序按多个列[重复]排序时降序为每个列

问题描述 投票:1回答:3

这个问题已经在这里有一个答案:

我有一个列表d,我想排序。我的第一列第一排序。如果它的领带有我然后继续使用第二列进行排序。说我想按升序排列,但排序降序排列第二列第一列进行排序。升序是默认值,使用我认为下面应该工作reverse关键。

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

但事实并非如此。它提供以下错误。

    reverse=(False,True))

TypeError: an integer is required (got type tuple)

所以,如果我不这样做是正确如何解决呢?还是要做到这一点的方式是完全不同的?在该意见将是有益的。

我的问题确实有一些重叠,但目前已经有有趣的反应,所以我想保留它。

python list sorting
3个回答
1
投票

docs

反向是一个布尔值。如果设置为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])

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
投票

我采取的解决方案:

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')]
© www.soinside.com 2019 - 2024. All rights reserved.