如何附加到dict中键值的列表?

时间:2015-11-10 11:29:44

标签: python list dictionary

我有一种情况,我在这种情况下解析文件并收集统计数据。我想将这些统计信息存储在嵌套的dict中,其最终值为列表。当我处理文件时,我想扩展列表。

例如我的dict结构是这样的

data_dict 
    { "aa1" :
         { 'aa' : []}
         { 'bb' : [] }
     "aa2" : 
         { 'ab' : []}
         { 'ba' : [] }
    }

现在,当我解析文件时,我想将值附加到最后一个列表 例如,在第一次出现数据时,我的dict应该是这样的。

data_dict 
    { "aa1" :
         { 'aa' : ['a0']}
         { 'bb' : ['a1'] }
     "aa2" : 
         { 'ab' : ['b0']}
         { 'ba' : ['b1'] }
    }

并且在第二个类似的东西

data_dict 
    { "aa1" :
         { 'aa' : ['a0', 'a01']}
         { 'bb' : ['a1', 'a11'] }
     "aa2" : 
         { 'ab' : ['b0', 'b01']}
         { 'ba' : ['b1', 'b11'] }
    }

此外,我没有将dict键初始化为任何内容并在第一次匹配时创建键。任何人都可以建议我如何实现这一目标?

注意我使用autovivification来初始化我的data_dict,它最初并不包含任何内容。

这是我尝试解析的示例数据

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有第一个键作为Tag列,第二个键作为%列之一,然后该键的值是完整文件中该值的所有实例。

这是我的处理代码,无效。

            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()

1 个答案:

答案 0 :(得分:2)

首先关闭:has_key已被弃用多年(在Py3中消失);您可以使用直接in检查。其次,你试图用has_key做什么是荒谬的[tag][col]不是没有索引的法律语法(没有索引/查找某些内容,它看起来像两个背靠背单个元素{{1}文字,这不是合法的语法)。测试的修复是单独测试每个组件(之后你可以追加,因为你知道该值存在):

list

旁注:你几乎不想要if tag in self.data_dict and col in self.data_dict[tag]: self.data_dict[tag][col].append(whatever_you_want_to_append) ;这是来自C风格for i in range(len(something)):循环背景的症状。除了获取值之外,您实际上并没有使用索引,所以请替换:

for

使用:

for item in range(len(header)):
    col = header[item]

运行速度更快,更具惯用性等。如果由于某种原因你也需要索引,那就是for col in header: 的用途:

enumerate

更新:您使用更多信息更新了问题,因此您需要并行迭代for i, col in enumerate(header): 。在这种情况下,请执行:

lat_data