2014-12-01 2 views
0

시작하려면 여기에 몇 가지 비슷한 제목의 질문이 있다는 것을 알고 있지만이 방법은 아무 것도 설명되지 않았고 문제 범위가 동일하지 않습니다.동적 중첩 사전

동적으로 중첩 된 사전 항목을 추가하고 싶습니다.

사용 사례는 다음과 같습니다. 네트워크를 모니터링하는 Python 스크립트가 있습니다. 관찰 된 IP 프로토콜 (tcp, udp, icmp)마다 사전이 생성됩니다. 그런 다음 각 IP 프로토콜 (80, 443 등)에 대한 대상 포트 (존재하는 경우) 인 키를 사용하여 하위 사전을 만듭니다 (서버 포트를 소스로 간주하는지 여부는 중요하지 않음을 유의하십시오 또는 대상이지만 일반적으로 서버가 대상이므로 HTTP 및 HTTPS를 예로 들었습니다. 이러한 각 대상 포트에 대해 서버 IP (예 : www.google.com의 IP)에 해당하는 키가 생성됩니다. 그리고 타임 스탬프를 가진 또 다른 사전이 세션의 키와 클라이언트의 IP가되는 키의 데이터/값으로 처음 관찰되었습니다.

그러나 실행하기 전이나 초기화 할 때 데이터가 없으므로 시간이 지나면 데이터가 채워 져야합니다.

{ 'icmp' : 
    { 'echo-request' : 
     { '<ip_of_www.google.com>' : 
      { '<timestamp>' : <some_client_ip> } 
     } 
     'echo-reply' : 
     { '<ip_of_www.google.com>' : 
      { '<timestamp>' : <some_client_ip> } 
     } 
    } 
    'tcp' : 
    { 
     '80' 
     { '<ip_of_www.google.com>' : 
      { '<timestamp>' : <some_client_ip> } 
      { '<timestamp>' : <some_client_ip> } 
     } 
     '443' 
     { '<ip_of_encrypted.google.com>' : 
      { '<timestamp>' : <some_client_ip> } 
      { '<timestamp>' : <some_client_ip> } 
      { '<timestamp>' : <some_client_ip> } 
      { '<timestamp>' : <some_client_ip> } 
     } 
    } 
} 

감사 :

출력은 유사 보일 것입니다! 여기

+0

1) 시간이 지남에 따라 사전을 업데이트하십시오. 2) note : 타임 스탬프는 중요하지 않습니다. 3) 구조가 올바르지 않습니다. 키에 대해 하나의 값만 가질 수 있습니다. –

+0

# 1 : 그게 정확히 내가 요구하는 것입니다 ... # 2 : 키로 타임 스탬프가 이해가 필요하지 않습니다, 이것은 과장된 예제입니다 # 3에 대해 : 나는 무엇에 대해 확신하지 못합니다. 당신은 이것에 의해 의미합니다. 물론 하나의 키만 있지만 각 키의 값은 다른 사전 (따라서 중첩 속성) 일 수 있습니다. 어디에서 다중 값 키를 보여 주었습니까/기대하고/묻었습니까? – Nick

+0

당신은 * 세 번째 포인트를 처리해야합니다 ... –

답변

3

당신은 다음과 같습니다

def set_nested(dict, value, *path): 
    for level in path[:-1]: 
     dict = dict.setdefault(level, {}) 

    dict[path[-1]] = value 


d = {} 

set_nested(d, '127.0.0.1', 'icmp', 'echo', 'google.com', '1 dec 2014') 
set_nested(d, '127.0.0.1', 'icmp', 'echo', 'google.com', '2 dec 2014') 
set_nested(d, '127.0.0.1', 'icmp', 'echo', 'yahoo.com', '2 dec 2014') 
set_nested(d, 'error', 'udp') 

from pprint import pprint 
pprint(d) 

출력 :

{'icmp': {'echo': {'google.com': {'1 dec 2014': '127.0.0.1', 
            '2 dec 2014': '127.0.0.1'}, 
        'yahoo.com': {'2 dec 2014': '127.0.0.1'}}}, 
'udp': 'error'} 

나는 또한 당신이 저장하고 쿼리 결과를하려는 경우 jsontinydb을 살펴 가지고하는 것이 좋습니다 것입니다.

+0

좋아 보인다. 나는 이것을 시험해보고 그것이 어떻게되는지 보게 될 것이다. 필자는 이전에 요소의 나머지 부분을 거슬러 올라가는 경로 스타일의 매개 변수에 익숙하지 않았습니다. 그 자체가 +1 가치가있다 : – Nick

+0

나는 당신의 코드를 실행할 때 다음과 같이'set_nested'를 한 번 더 호출한다 :'set_nested (d, 'not-an-error', 'udp', 'test')' , 나는'pprint (d)'부분에서 같은 결과물로 끝난다. 어떻게 해결할 것인가? –