按a、c、b排序stringmatrix[[a,b,c],…]是否保持顺序?

2024-05-16 04:19:32 发布

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

我在Python中有一个包含三个字符串的列表,例如

m = [['pig', 'quartz', '1'], ['pork', 'nails', '1'], ...]

我想按索引0排序,然后按索引2的相反顺序排序,然后按索引1排序。在排序的每一步,我都希望保持其他列所施加的顺序。例如

^{pr2}$

会变成:

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列((pig,1),(pork,4),(pork,1),…)内,按第二列排序。在

我怎么才能做得好呢?从概念上讲,如果operator.itemgetter()可以对排序顺序和索引进行编码,那么我需要类似m.sort(key=operator.itemgetter(0, -2, 1))的代码。在


Tags: 字符串列表排序顺序operatorquartzpigpork
3条回答
def key(item):
    return item[0], -int(item[2]), item[1]
m.sort(key = key)

注意,cmp关键字参数是removed from Python3。为了将来的兼容性,您可能希望继续使用key。在

使用自定义比较函数:

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

比较函数不是最优的,可能重写为:

^{pr2}$

正如其他人指出的那样,这也会起作用:

^{3}$

我会试试这样的方法:

def sort_key(a, b, c):
   return (a, -int(c) , b)           

m.sort(key = lambda row: sort_key(*row))

相关问题 更多 >