用a,-c,b对字符串矩阵[[a,b,c],...]进行排序,维持顺序?

时间:2012-03-13 17:55:56

标签: python string sorting multidimensional-array

我有一个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))之类的内容。

3 个答案:

答案 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