【问题标题】:Trouble with "multi-dimensional" dictionary [duplicate]“多维”字典的问题[重复]
【发布时间】:2014-07-20 20:54:11
【问题描述】:

我试图通过逐行读取另一个脚本的输出来动态创建以下数据结构,如果违反了某些阈值组合,我想在字典中跟踪它们:

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

我在这里做错了什么?

谢谢

【问题讨论】:

  • device 的值是多少?如果它不是一个字典,那么你试图做的事情就行不通。您可能应该查看deafultdict 类。

标签: python dictionary python-2.4


【解决方案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 或更高版本。

【讨论】:

【解决方案2】:

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

你应该说:

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

那么你已经让python提前知道它是一个空dict,它知道如何下标一个dict。

【讨论】:

  • Awesome thx... 写 perl 这么久了,它实际上可以让你做这样草率的事情。 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2023-04-03
  • 2012-11-19
相关资源
最近更新 更多