麻烦“多维”字典

时间:2014-05-31 02:09:58

标签: python python-2.4

我正在尝试通过逐行读取另一个脚本的输出来动态创建以下数据结构,如果某些阈值组合被破坏,我想跟踪字典中的那些:

data = {}

data[device]['mntpt']   = mntpt
data[device][timestamp] = { 'r_ops': r_ops, 'r_avgrtt': r_avgrtt, 'r_avgexe': r_avgexe, 'w_ops': w_ops, 'w_avgrtt': w_avgrtt, 'w_avgexe': w_avgexe }

对于每个设备,可以有不同数量的时间戳,每个时间戳包含6个数据点。 r_xxx和w_xxx变量是浮点数。 device,mntpt和timestamp是字符串。

我收到以下错误:

TypeError: unsubscriptable object

如果我注释掉这一行,我会得到同样的错误:

# data[device]['mntpt']   = mntpt

我在这里做错了什么?

THX

2 个答案:

答案 0 :(得分:1)

genisage有一个有效的解决方案。 You can also use a defaultdict

from collections import defaultdict

data = defaultdict(dict)

data[device]['mntpt']   = mntpt
data[device][timestamp] = { 'r_ops': r_ops, 'r_avgrtt': r_avgrtt, 'r_avgexe': r_avgexe, 'w_ops': w_ops, 'w_avgrtt': w_avgrtt, 'w_avgexe': w_avgexe }

这样做的方法是,如果您尝试分配给data[device],但尚未定义字典,它会自动为您创建一个字典。

这也适用于listint等。以下是list示例:

from collections import defaultdict

data = defaultdict(list)

data[device].append(mntpt)
data[device].append({ 'r_ops': r_ops, 'r_avgrtt': r_avgrtt, 'r_avgexe': r_avgexe, 'w_ops': w_ops, 'w_avgrtt': w_avgrtt, 'w_avgexe': w_avgexe })

编辑:此解决方案仅适用于Python 2.5或更高版本。

答案 1 :(得分:0)

当你说data = {}然后data[x][y] = z时,python会对你大喊大叫,因为你还没有告诉它data[x]是什么,所以它不知道如何下标它与y

你应该说:

data = {}
data[device] = {}
data[device]['mntpnt'] = mntpnt
data[device][timestamp] = {stuff}

然后你让python提前知道它是一个空的dict,它知道如何下标dict。