更新字典

时间:2015-01-28 03:36:12

标签: python dictionary

我创建了三个字典-dict1,dict2和dict2。我想先用dict2更新dict1,然后用dict3更新字典。我不确定他们为什么不加起来。

def wordcount_directory(directory):
    dict = {}
    filelist=[os.path.join(directory,f) for f in os.listdir(directory)]
    dicts=[wordcount_file(file) for file in filelist]
    dict1=dicts[0]
    dict2=dicts[1]
    dict3=dicts[2]
    for k,v in dict1.iteritems():
        if k in dict2.keys():
            dict1[k]+=1
        else:
            dict1[k]=v
    for k1,v1 in dict1.iteritems():
        if k1 in dict3.keys():
            dict1[k1]+=1
        else:
            dict1[k1]=v1
return dict1

print wordcount_directory("C:\\Users\\Phil2040\\Desktop\\Word_count")  

4 个答案:

答案 0 :(得分:4)

也许我对你的问题没有理解,但是你是否试图将每个词典中的所有值一起添加到一个最终词典中?如果是这样的话:

dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'b': 5, 'c': 1, 'd': 9}
dict3 = {'d': 1, 'e': 7}

def add_dict(to_dict, from_dict):
    for key, value in from_dict.iteritems():
        to_dict[key] = to_dict.get(key, 0) + value

result = dict(dict1)
add_dict(result, dict2)
add_dict(result, dict3)
print result

这会产生:{'a': 1, 'c': 4, 'b': 7, 'e': 7, 'd': 10}

发布您的问题的预期结果将非常有用。

修改

对于任意数量的词典:

result = dict(dicts[0])
for dict_sum in dicts[1:]:
    add_dict(result, dict_sum)
print(result)

如果您真的想以原来的格式修复原始问题中的代码:

  1. 当您应该执行dict1[k]+=1时,您正在使用dict1[k]+=dict2.get(k, 0)
  2. get的引入消除了使用if语句检查其存在的需要。
  3. 您需要通过dict2dict3进行迭代,以便将新密钥引入dict1
  4. (不是真正的问题,但值得一提)在if语句中检查密钥是否在字典中,建议只需要对if k in dict2:进行操作(有关详细信息,请参阅this post
  5. 借助@DisplacedAussie发现的惊人的内置库,答案可以进一步简化:

    from collections import Counter
    
    print(Counter(dict1) + Counter(dict2) + Counter(dict3))
    

    结果产生:Counter({'d': 10, 'b': 7, 'e': 7, 'c': 4, 'a': 1})

    Counter对象是dict的子类,因此可以使用与标准dict相同的方式。

答案 1 :(得分:3)

嗯,这是一个可能有用的简单功能:

def dictsum(dict1, dict2):
   '''Modify dict1 to accumulate new sums from dict2
   '''
   k1 = set(dict1.keys())
   k2 = set(dict2.keys())
   for i in k1 & k2:
       dict1[i] += dict2[i]
   for i in k2 - k1:
       dict1[i] = dict2[i]
   return None

...通过将第二个值添加到现有的交叉点更新;然后为差异添加这些键/值对。

通过这个定义,您可以进行简单的调用:

dictsum(dict1, dict2)
dictsum(dict1, dict3)

......快乐。

(我会注意到函数以这种方式修改字典的内容并不常见。我明确地返回None以遵循list.sort()方法建立的约定...函数在Python中修改容器内容通常不会返回容器的副本。

答案 2 :(得分:2)

如果我正确理解你的问题,那你就是在错误的字典上进行迭代。您希望迭代dict2并使用匹配的密钥更新dict1,或将不匹配的密钥添加到dict1

如果是,请按以下步骤更新for循环:

for k,v in dict2.iteritems():     # Iterate over dict2
    if k in dict1.keys():         
        dict1[k]+=1               # Update dict1 for matching keys 
    else:
        dict1[k]=v                # Add non-matching keys to dict1
for k1,v1 in dict3.iteritems():   # Iterate over dict3
    if k1 in dict1.keys():
        dict1[k1]+=1              # Update dict1 for matching keys
    else:
        dict1[k1]=v1              # Add non-matching keys to dict1

答案 3 :(得分:2)

我假设wordcount_file(file)返回file中找到的单词的dict,每个键都是一个单词,相关的值是该单词的计数。如果是这样,您的更新算法是错误的。你应该这样做:

keys1 = dict1.keys()
for k,v in dict2.iteritems():
    if k in keys1:
        dict1[k] += v
    else:
        dict1[k] = v

如果这些dict中有大量数据,您可以通过将密钥存储在一个集合中来加快密钥查找:

keys1 = set(dict1.keys())

您可能应该将该代码放入一个函数中,因此当您想要使用dict1中的数据更新dict3时,您不需要复制代码。

您应该查看collections.Counterdict的子类,支持计数;使用Counter将大大简化此任务。但如果这是一项任务(或者您使用的是Python 2.6或更早版本),则可能无法使用Counter