我有一个Python列表中的三个字符串列表,例如,
m = [['pig', 'quartz', '1'], ['pork', 'nails', '1'], ...]
我希望按索引0对其进行排序,然后按索引2按相反顺序排序,然后按索引1进行排序。在排序的每一步,我都要维护其他列强加的顺序。例如,
pork barn 4
pork barn2 4
pork nails 1
pig quartz 1
quinoa pail 1
quinoa quatern 1
quail quatern 1
radish barn 1
radish barn2 1
radish inbox 3
radish snow 1
会变成:
pig quartz 1
pork barn 4
pork barn2 4
pork nails 1
quail quatern 1
quinoa pail 1
quinoa quatern 1
radish inbox 3 <-
radish barn 1
radish barn2 1
radish snow 1
即按第一列排序,然后在每组第1列(猪,猪肉,鹌鹑......)中排序,按第三列排序,然后在每组第1列 - 第3列中排序((猪,1),(猪肉,4),(猪肉,1),......),按第二栏排序。
我怎么能很好地做到这一点?从概念上讲,如果operator.itemgetter()
可以将排序顺序与索引一起编码,我会想要m.sort(key=operator.itemgetter(0, -2, 1))
之类的内容。
答案 0 :(得分:4)
def key(item):
return item[0], -int(item[2]), item[1]
m.sort(key = key)
PS。 cmp
关键字参数为removed from Python3。为了将来的兼容性,您可能希望坚持使用key
。
答案 1 :(得分:2)
我会尝试这样的事情:
def sort_key(a, b, c):
return (a, -int(c) , b)
m.sort(key = lambda row: sort_key(*row))
答案 2 :(得分:1)
使用自定义比较功能:
def compare_triples(a, b):
ret=cmp(a[0], b[0])
if ret: return ret
ret=cmp(b[2], a[2])
if ret: return ret
return cmp(a[1], b[1])
for i in m: print i
print "-" * 79
m2=sorted(m, cmp=compare_triples)
for i in m2: print i
比较功能不是最佳的,可能会被重写为:
def compare_triples(a, b):
return cmp((a[0], b[2], a[1]), (b[0], a[2], b[1]))
正如其他人所指出的那样,这也会起作用:
def sort_key(a):
return a[0], -int(a[2]), a[1]
for i in sorted(m, key=sort_key): print i