2

Я пытаюсь использовать многомерный dict в python. В моем случае, мне нужно использовать структуру, как это:Как использовать многомерный dict в python

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

В этой структуре каждая клавиша является строка и последние значения в векторе. Я использую этот код для первой вставки:

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 

Кроме того, мне нужно итерацию по этой структуре. Вы знаете, как реализовать эту структуру и лучший способ их повторения?

+0

FYI, вы можете сократите свой код с помощью метода 'setdefault', который есть у всех dicts. – ThiefMaster

ответ

1

Проблема заключается в том, что вы назначили список MyDict[domain], а не словарь, попробуйте вместо этого:

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) 

Я не совсем ясно, что вы хотите видеть в итерации, но это должно вы начали:

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