Python 我怎样才能附加到dict中键值的列表中?
我有一种情况,我正在解析一个文件并收集统计数据。我想将这些统计数据存储在嵌套的dict中,该dict具有作为列表的最终值。在处理文件时,我想展开列表 例如,我的dict结构是这样的Python 我怎样才能附加到dict中键值的列表中?,python,list,dictionary,Python,List,Dictionary,我有一种情况,我正在解析一个文件并收集统计数据。我想将这些统计数据存储在嵌套的dict中,该dict具有作为列表的最终值。在处理文件时,我想展开列表 例如,我的dict结构是这样的 data_dict { "aa1" : { 'aa' : []} { 'bb' : [] } "aa2" : { 'ab' : []} { 'ba' : [] } } data_dict { "aa1"
data_dict
{ "aa1" :
{ 'aa' : []}
{ 'bb' : [] }
"aa2" :
{ 'ab' : []}
{ 'ba' : [] }
}
data_dict
{ "aa1" :
{ 'aa' : ['a0', 'a01']}
{ 'bb' : ['a1', 'a11'] }
"aa2" :
{ 'ab' : ['b0', 'b01']}
{ 'ba' : ['b1', 'b11'] }
}
现在,在解析文件时,我想将该值附加到最后一个列表中
例如,在第一次出现的数据中,我的dict应该是这样的
data_dict
{ "aa1" :
{ 'aa' : ['a0']}
{ 'bb' : ['a1'] }
"aa2" :
{ 'ab' : ['b0']}
{ 'ba' : ['b1'] }
}
第二种情况是这样的
data_dict
{ "aa1" :
{ 'aa' : []}
{ 'bb' : [] }
"aa2" :
{ 'ab' : []}
{ 'ba' : [] }
}
data_dict
{ "aa1" :
{ 'aa' : ['a0', 'a01']}
{ 'bb' : ['a1', 'a11'] }
"aa2" :
{ 'ab' : ['b0', 'b01']}
{ 'ba' : ['b1', 'b11'] }
}
此外,我没有初始化任何dict键,也没有在匹配的第一次出现时创建键。有人能建议我如何做到这一点吗
注意,我正在使用Autovification初始化我的数据目录,它最初不包含任何内容
这是我试图解析的示例数据
DATETIME TYPE TAG COUNT MEAN 1% 10% 20% 30% 40% 50% 60% 70% 80% 90% 99%
20151109044056 LS_I aa8 57 80,493,122 8,931,000 8,937,000 8,944,000 8,974,000 9,073,000 21,262,000 28,419,000 35,794,000 148,920,000 316,408,000 447,902,000
20151109044056 LS_I aa0 6,893 9,008,024 8,862,000 8,913,000 8,941,000 8,964,000 8,984,000 9,006,000 9,028,000 9,049,000 9,071,000 9,102,000 9,170,000
20151109044056 LS_I aa1 6,062 9,018,094 8,867,000 8,913,000 8,938,000 8,961,000 8,983,000 9,003,000 9,025,000 9,048,000 9,071,000 9,103,000 9,175,000
20151109044056 LS_I aa2 2,776 9,030,621 8,929,000 8,967,000 8,987,000 8,999,000 9,012,000 9,024,000 9,037,000 9,050,000 9,065,000 9,087,000 9,161,000
20151109044056 LS_I aa3 1,074 9,028,744 8,925,000 8,970,000 8,988,000 9,002,000 9,016,000 9,026,000 9,039,000 9,051,000 9,067,000 9,089,000 9,138,000
20151109044056 LS_I aa4 6,060 9,003,651 8,874,000 8,935,000 8,958,000 8,976,000 8,991,000 9,005,000 9,019,000 9,033,000 9,049,000 9,071,000 9,121,000
20151109044056 LS_I aa5 5,453 9,003,993 8,874,000 8,936,000 8,959,000 8,976,000 8,991,000 9,004,000 9,018,000 9,032,000 9,048,000 9,071,000 9,126,000
20151109044056 LS_I aa6 16,384 328 111 165 190 208 227 253 301 362 434 551 997
20151109044056 LS_I aa7 16,384 316 58 65 70 76 87 137 308 395 512 702 1,562
所以我的dict有第一个键作为标记列,第二个键作为%列之一,然后这个键的值就是完整文件中该值的所有实例
这是我的处理代码,它不工作
while re.match("\d{14}\s.*", curr_line):
lat_data = curr_line.split()
tag = lat_data[header.index("TAG")]
for item in range(len(header)):
col = header[item]
if '%' in col or\
"COUNT" in col or\
"MEAN" in col:
self.data_dict[tag][col].append(lat_data[item])
curr_line = lat_file.next()
首先:
has_key
已被弃用多年(在Py3中消失);您可以在检查中使用直接。第二,你试图用has_key做的事情是毫无意义的[tag][col]
不是没有索引的合法语法(如果没有索引/查找某些内容,它看起来像两个背对背的单个元素列表
文本,这不是合法语法)。测试的修复方法是单独测试每个组件(之后可以追加,因为您知道该值存在):
旁注:你几乎永远都不想看到范围内的i(len(某物)):
;这是来自C风格for
循环背景的症状。除了获取值之外,实际上没有使用索引进行任何操作,因此请替换:
for item in range(len(header)):
col = header[item]
与:
运行速度更快、更惯用等。如果出于某种原因也需要索引,这就是enumerate
的作用:
for i, col in enumerate(header):
更新:您用更多信息更新了问题,因此看起来您需要并行迭代lat_数据
。在这种情况下,请执行以下操作:
for col, lat in zip(header, lat_data):
...
if tag in self.data_dict and col in self.data_dict[tag]:
self.data_dict[tag][col].append(lat)
需要更多的信息。1,2是什么?它们是行号吗?何时将值添加到“a”和何时添加到“b”?不,它们只是键。我用它作为虚拟变量。我做了一些修改,使其更加清晰,或者在如何使用defaultdict或setdefault方法方面,您的示例不是有效的Python。例如,我猜您的意思是
“aa1”
,而不是aa1
,并且每个值都是一个字典,而不是一个字典列表。对吗?你能澄清一下吗?也就是说,您可能想看一看。@TimPietzcker我不确定defaultdict将如何提供帮助,因为我的dict是嵌套的dict。