如何在python中使用多维dict

时间:2014-11-06 07:57:06

标签: python python-3.x dictionary multidimensional-array defaultdict

我正在尝试在python中使用多维dict。就我而言,我需要使用这样的结构:

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

此外,我需要迭代这个结构。你知道如何实现这个结构以及迭代它们的最佳方法吗?

1 个答案:

答案 0 :(得分: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

或更多&#39; Pythonic&#39;版本:

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