我有一个列表--account
我想排序。我首先按第一列排序。如果有关系,那么我继续使用第二列进行排序。假设我想按升序按第一列排序,但按降序按第二列排序。升为默认值,使用d
键,我认为以下内容应能工作。
reverse
但事实并非如此。它给出了以下错误。
sorted(d,key=lambda x: (x[0],x[1]),reverse=(False,True))
因此,如果我没有正确执行操作,该如何解决?还是这样做的方式完全不同?对此的建议会有所帮助。
我的问题确实存在重复,但已经有有趣的回答,因此我想保留它。
答案 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')]