데이터가 매우 규칙적으로 표시되므로 키 인수를 사용하여 Python에서 올바른 정렬을 보장하는 것이 매우 쉽습니다. 정렬 할 목록의 각 인스턴스에 대해 "정렬 키"를 만드는 데 사용됩니다. 사람들은 종종 람다를 정렬 키 함수로 사용하지만 여기서 완전성을 위해 def이 유용합니다.
중복 제거는 Python으로 정렬하기 전에 수행하는 것이 좋습니다. 어쨌든 목록을 정렬해야하기 때문에 집합으로 변환하면 고유 한 문자열을 순서없이 임의로 정렬 할 수 있습니다. 목록을 "uniquieify"하는 쉬운 방법 l Python에서 순서가 중요하지 않은 경우
l = list(set(l))
테스트 데이터는 심하게, 그런데, 선택이기 때문에 것이다 올바르게 정렬 (단지 사고에 의해) 어휘 종류에. 따라서 주소에 2 자리 및 3 자리 구성 요소가 포함 된 몇 가지 예를 포함하면 더 나아질 수 있으므로 더 이상 사실이 아닙니다. 나는 설명의 방법으로 비 작동 종류를 설명한다.
In [42]: data = """\
4.4.4.4/32
4.2.2.2/32
4.4.4.4/32
4.2.2.2/32
4.2.2.2/28
4.4.4.4/24
2.2.2.2/32
12.13.14.15/24
11.12.13.14/24""".splitlines()
In [43]: data.sort()
In [44]: data
Out[44]:
['11.12.13.14/24',
'12.13.14.15/24',
'2.2.2.2/32',
'4.2.2.2/28',
'4.2.2.2/32',
'4.2.2.2/32',
'4.4.4.4/24',
'4.4.4.4/32',
'4.4.4.4/32']
In [45]: data = list(set(data))
In [46]: data.sort()
In [47]: data
Out[47]:
['11.12.13.14/24',
'12.13.14.15/24',
'2.2.2.2/32',
'4.2.2.2/28',
'4.2.2.2/32',
'4.4.4.4/24',
'4.4.4.4/32']
In [48]: def sortkey(addr):
....: add, pref = addr.split("/")
....: a, b, c, d = (int(x) for x in add.split("."))
....: return a, b, c, d, int(pref)
....:
In [49]: data.sort(key=sortkey)
In [50]: data
Out[50]:
['2.2.2.2/32',
'4.2.2.2/28',
'4.2.2.2/32',
'4.4.4.4/24',
'4.4.4.4/32',
'11.12.13.14/24',
'12.13.14.15/24']
그것은 않습니다 그것이 "/ 장식/정렬 undecorate"알고리즘의 일부로 각 목록 값에 한 번만 적용되기 때문에 정렬 키 기능, 파이썬에 있음을 너무 많이 중요하지. 좀더 일반적으로,이 문제 도메인에 대해 도움이되는 ipaddress 모듈을 찾을 수 있습니다 : http://docs.python.org/dev/howto/ipaddress.html
왜 'sort -u'가 부적절한 이유는 무엇입니까? – Kevin
감사. sort -u는 괜찮지 만 python/perl 스크립트를 찾고있었습니다. 내 질문에 명확하게 말 했어야합니다 .. – rtinflux
예상되는 결과는 무엇입니까?/32,/28, ...에 상관없이 중복되는 IP를 제거한다는 의미였습니까? –