2012-05-29 85 views
0

列表值我创建的列表的字典使用:访问字典

names = defaultdict(list) 

我读从文本文件中的一行,它分成3列。我将该行的第一列作为关键字,将其他两列作为列表中的值。我用下面的代码段如下:

with open('f.txt') as f: 
    lines = [l.split() for l in f.readlines() if l.strip()] 
    for l in lines: 
      names[l[0]].append([l[1],l[2]]) 

我有文本文件是这样的:

00:12:34:23:45:67  134  123.456 

45:34:23:45:44:23  133  345.123 

3f:32:dr:45:34:r5  133  212.345 

00:12:34:23:45:67  134  555.555 

00:12:34:23:45:67  136  555.556 

00:12:34:23:45:67  134  555.560 

如果我跑我的程序输出键:值对,输出为:

00:12:34:23:45:67 [['134', '123.456'], ['134', '555.555'], ['136', '555.556'], ['134', '555.560']] 

45:34:23:45:44:23 [['133', '345.123']] 

3f:32:dr:45:34:r5 [['133', '212.345']] 

如何访问列表中的各个元素?例如,在这个输出中,我要计算每个键的133,134,135,136的数量以及每种类型之间的时间差。例如,对于密钥00:12:34:23:45:67,有3个134,1 136.该密钥的最高值和最低值之间的时间差为555.560-123.456。我想要所有133,134,135,136种类型的结果。我很多天都在为这个问题苦苦挣扎。请帮忙。非常感激。

+1

我该如何接受答案?点击哪个按钮? – learner

+0

最佳答案旁边的复选标记。 –

+0

@ user1411416 [这个元问题详细解释了如何接受答案。](http://meta.stackexchange.com/a/5235/141962) – phihag

回答

3

这似乎是一个更好的数据结构是为了在这里...

from collections import defaultdict 
names=defaultdict(lambda :defaultdict(list)) 

with open('f.txt') as f: 
    lines = [l.split() for l in f.readlines() if l.strip()] 
    for l in lines: 
     names[l[0]][l[1]].append(float(l[2])) 

现在,拿到计数和差异从最大/最小:

for k,v in names.items(): 
    for kk,vv in v.items(): 
     print k,kk,len(vv),max(vv)-min(vv) 

输出:

00:12:34:23:45:67 136 1 0.0 
00:12:34:23:45:67 134 3 432.104 
45:34:23:45:44:23 133 1 0.0 
3f:32:dr:45:34:r5 133 1 0.0 
+1

+1,但是我可以建议将'l'解包为'name,val1,val2'还是类似的东西? – senderle

+0

我同意问题中提出的数据结构让事情变得困难。 – Chris

+0

我收到一个错误:''list'object has no attribute'items'“ – learner

0

要计算的计数,你可以做到以下几点:

counts = {} 
for key, values in names.items(): 
    for v in values: 
     if v[0] in counts: 
      counts[v[0]] += 1 
     else: 
      counts[v[0]] = 1