这个问题已经在这里有一个答案:
我有一个列表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)
所以,如果我不这样做是正确如何解决呢?还是要做到这一点的方式是完全不同的?在该意见将是有益的。
我的问题确实有一些重叠,但目前已经有有趣的反应,所以我想保留它。
从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])
(可能是矫枉过正,但..)使用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]]
我采取的解决方案:
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')]