python中考虑两个或三个索引的列表排序

2024-05-16 15:13:06 发布

您现在位置:Python中文网/ 问答频道 /正文

list = [["hasan",6,"bad","chennai"], ["vishnu",7,"good","chennai"], ["tabraiz",8,"good","bangalore"], ["shaik",5,"excellent","chennai"], ["mani",6,"avarage","kerala"], ["cilvin",9,"excellent","chennai"]]

优先考虑

{'excellent':4, 'good':3, 'average':2, 'bad':1}    

list.sort(key=lambda x: (x[3], -x[2], -x[1]))
list.sort(key=lambda x: (x[2], x[0], -x[1]))
list.sort(key=lambda x: (x[2], -x[3], x[0]))

这些都起作用了。你知道吗

但上面说

TypeError: bad operand type for unary -: 'str'

在第一个位置放负号的时候。你知道吗

ie公司

list.sort(key=lambda x: (-x[3], x[2], x[1]))

为什么????你知道吗


Tags: lambdakeysortlistbadgoodexcellentchennai
1条回答
网友
1楼 · 发布于 2024-05-16 15:13:06

您的方法的问题是x[3]是一个字符串,因此执行-x[3]是没有意义的。你知道吗

我不确定是否有更简单的解决方案,但您可以使用^{},并定义自己的反向key函数:

from functools import cmp_to_key

l = [['hasan', 6, 'bad', 'chennai'],
     ['vishnu', 7, 'good', 'chennai'],
     ['tabraiz', 8, 'good', 'bangalore'],
     ['shaik', 5, 'excellent', 'chennai'],
     ['mani', 6, 'avarage', 'kerala'],
     ['cilvin', 9, 'excellent', 'chennai']]

rev_key = cmp_to_key(lambda x,y: 1 if x<y else -1 if x>y else 0)
l.sort(key=lambda x: (rev_key(x[3]), x[2], x[1]))
print(l)

结果:

[['mani', 6, 'avarage', 'kerala'],
 ['hasan', 6, 'bad', 'chennai'],
 ['shaik', 5, 'excellent', 'chennai'],
 ['cilvin', 9, 'excellent', 'chennai'],
 ['vishnu', 7, 'good', 'chennai'],
 ['tabraiz', 8, 'good', 'bangalore']]

请注意,如果您使用的是Python2,那么只需编写:

rev_key = cmp_to_key(lambda x,y: cmp(y,x))

如果不想根据几个键进行排序,正确的方法是使用reverse参数:

>>> sorted(l, key=lambda x: x[3], reverse=True)
[['mani', 6, 'avarage', 'kerala'],
 ['hasan', 6, 'bad', 'chennai'],
 ['vishnu', 7, 'good', 'chennai'],
 ['shaik', 5, 'excellent', 'chennai'],
 ['cilvin', 9, 'excellent', 'chennai'],
 ['tabraiz', 8, 'good', 'bangalore']]

相关问题 更多 >