我有一个文件,例如:
a 1
a 2
b 5
c 8
a 9
我想将每个键的第二个字段加在一起,这样我就有了一个聚合数字,因此只有一个键:值对。
对于大型数据集,我认为最好的方法是创建一个包含每个唯一键值列表的字典。这是最好的方法吗?
如何准确设置每个键的值列表(下面的代码似乎覆盖了值而不是附加值)?
dict={}
file=open('foo.txt','r')
lines=file.readlines()
for line in lines:
k, v=line.split()
dict[k]=[v]
现在,如果我想获取第一个字典中填充的聚合数字,并将键和值与另一个字典中的键和值进行比较,以确定两者之间的差异,我只能得出如下结果:
for res inkeys():
if res2.get(i):
print 'match',i
else:
print i,'does not match'
表示res2.keys()中的i:
if res.get(i):
print 'match',i
else:
print i,'does not match'
for res invalues():
if res2.get(i):
print 'match',i
else:
print i,'does not match'
表示res2.values()中的i:
if res.get(i):
print 'match',i
else:
print i,'does not match'
笨重而且错误......需要帮助!
答案 0 :(得分:7)
使用defaultdict
计算总和:
from collections import defaultdict
res = defaultdict(int)
with open('foo.txt', 'r') as f:
for line in f:
k,v = line.split()
res[k] += int(v)
# res is now {"a": 12, "b": 5, "c": 8}
如果您不想要总和,但需要元素列表,请将其修改为:
from collections import defaultdict
res = defaultdict(list)
with open('foo.txt', 'r') as f:
for line in f:
k,v = line.split()
res[k].append(v)
# res is now ["a": ["1", "2", "9"], "b": ["5"], "c": ["8"]]
请注意,我更改了一些变量名称,值得注意的是file
到f
和dict
到res
。这是因为file
和dict
是内置函数的名称,因此应该避免使用变量名称以避免混淆。
此外,readlines
不是必需的;你可以直接遍历文件。
此外,with
语句可确保文件在之后关闭。
答案 1 :(得分:4)
如果您只想要一个总计,则无需创建list
来附加元素。您可以使用defaultdict
并继续添加以获得总计。
from collections import defaultdict
key_totals = defaultdict(int)
with open('foo.txt', 'r') as f:
for line in f:
k, v = line.split()
key_totals[k] += int(v)
答案 2 :(得分:1)
这正是setdefault()
的用途:
d = {}
with open('foo.txt','r') as f:
for line in f:
k,v = line.split()
d.setdefault(k, []).append(v)
此外,请勿使用dict
作为变量名称。你可以直接在文件上迭代;这里不需要使用.readlines()
。