2011-08-02 4 views
1

IP 주소 목록을 CIDR 목록 (netaddr, ipaddr-py)으로 변환하는 방법은 여러 가지가 있습니다. IP 주소 범위 목록을 병합 된 IP 범위로 변환하는 방법이 있습니까?파이썬 - IP 주소 목록을 주소 범위 목록으로 변환

본인의 일반적인 질문은 previous question on glob formatting입니다.

다음 예제는 [(start, end)] 형식의 튜플 목록을 반환합니다.

예 1 :

>>> list_of_ips = ['192.168.0.1', '192.168.0.2', '192.168.0.3'] 
>>> print merge_ip_list(list_of_ips) 
[('192.168.0.1','192.168.0.3')] 

예 2 :

>>> list_of_ips2 = ['10.0.0.0', '10.0.0.3', '10.0.0.4'] 
>>> print merge_ip_list(list_of_ips2) 
[('10.0.0.0','10.0.0.0'), ('10.0.0.3','10.0.0.4')] 
+0

코드를 작성해 보시지 않겠습니다. 문제가 생기면 도움을 드리겠습니다. – Gerrat

+0

나는 어떻게 시작할 지 잘 모르겠다. 나의 본능은 이것이 재귀를 요구할 것이라고 말하고있다. 예제 1을 192.168.0.1과 192.168.0.2'('192.168.0.1', '192.168.0.2') '와 결합한 후 결과 범위를 192.168.0.3'('192.168.0.1'- ' 192.168.0.3 ')'. – paragbaxi

+0

아마도 재귀를 사용하여 수행 할 수는 있지만 순서대로 각 항목을 처리하고 이전 항목과 '다음 항목'이 맞는지 확인해보십시오.이 항목이 있으면 추적하고 현재 범위를 계속 확장하고, 그렇지 않을 때까지 다음 범위에서 시작합니다. – Gerrat

답변

3

시작하는 좋은 점은 INT로 다시 점으로 구분 된 문자열에서 컨버터를 만드는 것입니다 이럴. 정수 표시가 더 편리합니다.

줄이기를 생각했지만 너무 어려워 보입니다. 그래서 난 그냥 전통적인 루프를 사용하고 재귀없이 구현했습니다.

def int2dot(intip): 
    return '.'.join([ str((intip>>x*8) & 0xFF) for x in [3,2,1,0]]) 
def dot2int(dotip): 
    return reduce(lambda r,x: int(x)+(r<<8), dotip.split('.'), 0) 

def merge_ip_list(ip_list): 
    if not ip_list: 
     return [] 
    orig = map(dot2int,ip_list) 
    orig.sort() 
    start = orig[0] 
    prev = start-1 
    res = [] 
    for x in orig: 
     if x != prev+1: 
      res.append((int2dot(start),int2dot(prev))) 
      start = x 
     prev = x 
    res.append((int2dot(start),int2dot(prev))) 
    return res 

편집 : 버그 수정.

def merge_ip_list_alt(ip_list): 
    if not ip_list: 
     return [] 
    orig = sorted(map(dot2int,ip_list)) 
    end, start = zip(*[x for x in zip(orig,orig[1:]) if x[0]+1!=x[1]]) or ((),()) 
    start = [int2dot(orig[0])] + map(int2dot,start) 
    end = map(int2dot,end) + [int2dot(orig[-1])] 
    return zip(start, end) 

은 내가 당신에게 미래에 대한 조언을 들어 보겠습니다 :

또한 내가 대체 솔루션을했습니다. 사람들에게 코드를 작성하도록 요청하지 마십시오. 내가 할 수있는 한 코드를 작게 만들고 내 지식을 향상시키는 데 관심이 있었기 때문에 나는 당신을 도왔습니다. 그러나 로빈 후드가 항상 여기있는 것은 아닙니다. 직접 무언가를 개발하면 알고리즘과 코드에서 실수를 찾아내는 데 도움이됩니다.

+1

프로그램을 사용해보십시오 : list_of_ips = [ '192.168.0.1', '192.168.0.2', '192.168.0.3', '192.168.0.5'] – Gerrat

+0

안녕하세요, 도와 줘서 고마워. 나는 이것을 시작하는 방법에 대한 단서가 없어서 고마워한다. 나는이 공동체가 완전한 코드를 작성하는 것이 아니라 회원들을 돕는 것이 중요하다는 데 동의한다. 사실 나는 올바른 방향으로 밀어 넣기를 한 후에 많은 질문에 답을했습니다. 코드를 분석하고 다시보고 해 주시고, 잘하면 대답을 해보겠습니다. – paragbaxi

+0

@Gerrat, 고쳐졌습니다. –