2

我試圖在python中使用多維字典。就我而言,我需要使用的結構是這樣的:如何在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

僅供參考,你可以通過使用所有字典所具有的'setdefault'方法來縮短代碼。 – ThiefMaster 2014-11-06 08:05:44

回答

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 

或更多的 'Python化' 版本:

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

到目前爲止的答案很好。 OP的問題的第二部分詢問如何遍歷MyDict。 – irrelephant 2014-11-06 08:08:00

+0

優秀的答案。你能告訴我如何迭代這個嗎?謝謝 – hasmet 2014-11-06 08:09:26

+0

@hasmet你想在迭代中看到什麼值? – codebox 2014-11-06 08:10:24