我有一个输出大量数据的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之前出现!
一如既往,非常感谢您的耐心等待。
答案 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脚本中使用某种桶排序,这应该快得多。