python中的复合排序

时间:2009-06-28 07:26:11

标签: python sorting

我有一个输出大量数据的python脚本,示例如下。 4个字段中的第一个字母总是由两个字母组成,一个数字,一个斜线和一个或两个数字

Gi3/2 --.--.--.-- 0024.e89b.c10e Dell Inc.  
Gi5/4 --.--.--.-- 0030.c1cd.f038 HEWLETTPACKARD   
Gi4/3 --.--.--.-- 0020.ac00.6703 INTERFLEX DATENSYSTEME GMBH  
Gi3/7 --.--.--.-- 0009.4392.34f2 Cisco Systems  
Gi6/6 --.--.--.-- 001c.2333.bd5a Dell Inc  
Gi3/16 --.--.--.-- 0009.7c92.7af2 Cisco Systems  
Gi5/12 --.--.--.-- 0020.ac00.3fb0 INTERFLEX DATENSYSTEME GMBH  
Gi4/5 --.--.--.-- 0009.4392.6db2 Cisco Systems  
Gi4/6 --.--.--.-- 000b.cd39.c7c8 Hewlett Packard  
Gi6/4 --.--.--.-- 0021.70d7.8d33 Dell Inc  
Gi6/14 --.--.--.-- 0009.7c91.fa71 Cisco Systems  

在第一个字段上对此进行正确排序的最佳方法是什么,以便此示例读取

Gi3/2   --.--.--.-- 0024.e89b.c10e  Dell Inc.  
Gi3/7   --.--.--.-- 0009.4392.34f2  Cisco Systems  
Gi3/16  --.--.--.-- 0009.7c92.7af2  Cisco Systems  
Gi4/3   --.--.--.-- 0020.ac00.6703  INTERFLEX DATENSYSTEME GMBH  
Gi4/5   --.--.--.-- 0009.4392.6db2  Cisco Systems  
Gi4/6   --.--.--.-- 000b.cd39.c7c8  Hewlett Packard  
Gi5/4   --.--.--.-- 0030.c1cd.f038  HEWLETT PACKARD  
Gi5/12  --.--.--.-- 0020.ac00.3fb0  INTERFLEX DATENSYSTEME GMBH  
Gi6/14  --.--.--.-- 0009.7c91.fa71  Cisco Systems  
Gi6/4   --.--.--.-- 0021.70d7.8d33  Dell Inc  
Gi6/6   --.--.--.-- 001c.2333.bd5a  Dell Inc  

我的努力非常混乱,并且导致了数字,比如12在5之前出现!

一如既往,非常感谢您的耐心等待。

4 个答案:

答案 0 :(得分:5)

def lineKey (line):
    keyStr, rest = line.split(' ', 1)
    a, b = keyStr.split('/', 1)
    return (a, int(b))

sorted(lines, key=lineKey)

答案 1 :(得分:4)

对每一行进行排序,使得你有两个元组,部分位于/之后的整数部分,因此每一行应按类似('Gi6',12)的方式排序,见下面的例子

s="""Gi3/2 --.--.--.-- 0024.e89b.c10e Dell Inc.  
Gi5/4 --.--.--.-- 0030.c1cd.f038 HEWLETTPACKARD   
Gi4/3 --.--.--.-- 0020.ac00.6703 INTERFLEX DATENSYSTEME GMBH  
Gi3/7 --.--.--.-- 0009.4392.34f2 Cisco Systems  
Gi6/6 --.--.--.-- 001c.2333.bd5a Dell Inc  
Gi3/16 --.--.--.-- 0009.7c92.7af2 Cisco Systems  
Gi5/12 --.--.--.-- 0020.ac00.3fb0 INTERFLEX DATENSYSTEME GMBH  
Gi4/5 --.--.--.-- 0009.4392.6db2 Cisco Systems  
Gi4/6 --.--.--.-- 000b.cd39.c7c8 Hewlett Packard  
Gi6/4 --.--.--.-- 0021.70d7.8d33 Dell Inc  
Gi6/14 --.--.--.-- 0009.7c91.fa71 Cisco Systems"""

lines = s.split("\n")
def sortKey(l):
    a,b = l.split("/")
    b=int(b[:2].strip())
    return (a,b)

lines.sort(key=sortKey)

for l in lines: print l

答案 2 :(得分:1)

您可以为.sort([cmp[, key[, reverse]]])来电定义cmp() comparison function

  

sort()方法采用可选参数来控制比较。

     

cmp指定两个参数(列表项)的自定义比较函数,它应返回负数,零或正数,具体取决于第一个参数是否被认为小于,等于或大于第二个参数:cmp = lambda x,y:cmp(x.lower(),y.lower())。默认值为None。

cmp()函数中,检索数字键并使用int(field)确保数字(非文本)比较。

或者,可以定义key() function(谢谢,@ Anurag Uniyal):

  

key指定一个参数的函数,用于从每个列表元素中提取比较键:(例如key=str.lower)。默认值为None。

答案 3 :(得分:0)

如果您在unix环境中工作,可以使用“排序”对这些列表进行排序。

另一种可能性是在你的python脚本中使用某种桶排序,这应该快得多。