我有一个文件,例如:
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]
现在如果我想获取第一个字典中填充的聚合数字并将键和值与另一个字典中的键和值进行比较以确定两者之间的差异,我只能得出如下结论:
对于 res.keys() 中的我:
if res2.get(i):
print 'match',i
else:
print i,'does not match'
对于 res2.keys() 中的我:
if res.get(i):
print 'match',i
else:
print i,'does not match'
对于 res.values() 中的 i:
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'
麻烦而且有问题...需要帮助!
请您参考如下方法:
使用 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声明确保文件在之后关闭。
