2

파이썬에서 다차원 사전을 사용하려고합니다. 필자의 경우 다음과 같은 구조를 사용해야합니다.파이썬에서 다차원 사전을 사용하는 방법

MyDict[domain][IPAddress][UserAgent1, UserAgent2, UserAgent3, ....] 

이 구조에서 각 키는 String이고 마지막 값은 벡터에 있습니다. 나는 처음 삽입이 코드를 사용하고 있습니다 :

from collections import defaultdict 
MyDict= defaultdict(lambda: defaultdict(lambda: defaultdict(3))) 

if domain not in MyDict: 
    MyDict[domain] = [] 
if IPAddress not in MyDict[domain]: 
    MyDict[domain].append(IPAddress) 
if UserAgent1 not in MyDict[domain][IPAddress]: 
    MyDict[domain][IPAddress].append(UserAgent1) 

하지만이 코드는 오류가 작동하지 않습니다 :

Traceback (most recent call last): 
    File "/.../Main.py", line 33, in <module> 
    if UserAgent1 not in MyDict[domain][IPAddress]: 
TypeError: list indices must be integers, not str 

은 또한, 나는이 구조를 반복 할 필요가있다. 이 구조체를 구현하는 방법과 반복적 인 방법을 알고 있습니까? 난 당신이 반복에 표시 할 정확하게 명확하지 않다

if domain not in MyDict: 
    MyDict[domain] = {} 
if IPAddress not in MyDict[domain]: 
    MyDict[domain][IPAddress] = [] 
if UserAgent1 not in MyDict[domain][IPAddress]: 
    MyDict[domain][IPAddress].append(UserAgent1) 

, 그러나 이것은 얻어야한다 :

+0

, 당신은 할 수 있습니다 모든 dicts가 가지고있는'setdefault' 메쏘드를 사용하여 코드를 줄이십시오. – ThiefMaster

답변

1

문제는 당신이 아니라 사전보다 MyDict[domain]에 목록을 할당 한 것입니다, 대신 시도 당신은 시작 :

for domain in MyDict: 
    for ipAddress in MyDict[domain]: 
     for userAgent in MyDict[domain][ipAddress]: 
      # code here will run for each combination of domain, ipAddress and userAgent 

또는 더 '파이썬'버전 : 참고하시기 바랍니다

[[domain, ipAddress, userAgent] for domain in MyDict for ipAddress in MyDict[domain] for userAgent in MyDict[domain][ipAddress]] 
+0

지금까지 좋은 답변. OP 질문의 두 번째 부분은 'MyDict'를 반복하는 방법을 묻습니다. – irrelephant

+0

우수 답변. 이걸 반복하는 법도 알려주시겠습니까? 감사합니다. – hasmet

+0

@hasmet 반복에서보고 싶은 가치는 무엇입니까? – codebox

관련 문제