我有以下数据:
foo a 199
foo b 200
foo c 300
foo a 103
foo b 400
foo c 120
bar a 100
bar b 100
bar c 100
我想得到的是一个如下字典:
{foo:{a:302, # 199 + 103
b:600, # 200 + 400
c:420,}, # 300 + 120
bar:{a:100,
b:100,
c:100}}
我坚持使用这段代码:
import csv
from collections import defaultdict
outerdict = defaultdict(dict)
with open('myinputabove.txt','r') as tsvfile:
tabheader = csv.reader(tsvfile,delimeter=" ")
for row in tabheader:
val1 = row[0]
val2 = row[1]
val3 = row[2]
outerdict[val1][val2] += val3
答案 0 :(得分:2)
你走在正确的道路上。对代码进行一些修改可以解决问题。
csv
模块解析时,每个元素都是一个字符串。那么你
在添加之前必须将val3
转换为int。KeyError
。以下代码有效:
outerdict = defaultdict(dict)
with open('file.txt','r') as tsvfile:
tabheader = csv.reader(tsvfile, delimiter=" ")
for row in tabheader:
val1 = row[0]
val2 = row[1]
val3 = row[2]
try:
outerdict[val1][val2] += int(val3)
except KeyError:
outerdict[val1][val2] = int(val3)
答案 1 :(得分:1)
outerdict[val1]
即使dict
为false,也会是val1 in outerdict
,因为outerdict
是defaultdict
。但如果outerdict[val1][val2]
为false,val2 in outerdict[val1]
可能会导致关键错误,因为outerdict[val1]
只是dict
,而不是defaultdict
。
尝试outerdict = defaultdict(lambda: defaultdict(int))
。
或者,如果您对结果看起来像这样:
{
('foo', 'a'): 302,
('foo', 'b'): 600,
('foo', 'c'): 420,
('bar', 'a'): 100,
('bar', 'b'): 100,
('bar', 'c'): 100
}
您可以使用outerdict = defaultdict(int)
和outerdict[val1,val2] += val3
。