带有值列表的字典

时间:2012-02-12 16:56:00

标签: python

我有一个文件,例如:

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'

笨重而且错误......需要帮助!

3 个答案:

答案 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"]]

请注意,我更改了一些变量名称,值得注意的是filefdictres。这是因为filedict是内置函数的名称,因此应该避免使用变量名称以避免混淆。

此外,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()