2009-06-28 4 views
1

나는 많은 양의 데이터를 출력하는 파이썬 스크립트를 가지고있다. 샘플은 다음과 같다. 4 개 필드의 첫 번째는 항상 두 글자, 한 자리에서 슬래시 하나 또는 두 자리python에서 정렬하는 화합물

구성
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

p.s. 개인 정보 보호를 위해 필드 2의 IP 주소가 제거되면 각 행에 대해 고유 한 값이됩니다. –

+0

스크립트에서 출력을 생성하는 경우이 문자열 형식의 데이터/이전/정렬을 정렬하는 것이 좋습니다. –

+0

감사합니다. 출력을 목록으로 옮긴 다음 yairchu에서 제안한 함수로 전달했습니다. 내가 작성한 유일한 변경 사항은 list2 = sorted (list1, key = lineKey)라는 다른 목록을 작성한 다음 인쇄하는 것입니다. 매우 Pythonic하지만 내가 필요로하지 않습니다. 나는이 스크립트의 앞부분에서 이것을 할 수 있었음에 동의한다. –

답변

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

sorted(lines, key=lineKey) 
1

당신은 .sort([cmp[, key[, reverse]]]) 전화를 들어, cmp() comparison function 정의 할 수 있습니다 :

정렬() 메소드는 비교를 제어하기위한 선택적인 인수를 취합니다.

cmp은 첫 번째 인수가 두 번째 인수보다 작거나 같거나 큰지 여부에 따라 음수, 양수 또는 양수를 반환해야하는 두 개의 인수 (목록 항목)의 사용자 지정 비교 함수를 지정합니다. cmp = 람다 x, y : cmp (x.lower(), y.lower()). 기본값은 없음입니다.

cmp() 함수에서 숫자 키를 검색하고 int(field)을 사용하여 숫자 (텍스트가 아닌) 비교를 보장합니다.

다르게하는 key() function는 (감사 @ 아 누락 ​​Uniyal) 정의 될 수있다 (예컨대 key=str.lower)

key 각리스트 요소에서 비교 키를 추출하기 위해 사용되는 하나 개의 인자의 함수를 지정한다. 기본값은 없음입니다.

+2

키 대신 cmp를 사용하는 것이 좋습니다. –

4

는 그 후 2 튜플, 전 부품/정수 부분이되도록 각 행을 분할 정렬하려면, 각각의 라인은

아래 예 참조 ('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 
0

유닉스 환경에서 작업하는 경우 "정렬"을 사용하여 이러한 목록을 정렬 할 수 있습니다.

또 다른 가능성은 python 스크립트에서 일종의 버킷 정렬을 사용하는 것이 훨씬 빠릅니다.