更新字典
Updating a 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")
如果我正确理解了你的问题,那么你正在迭代错误的字典。您想要迭代 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
我假设 wordcount_file(file)
returns 是在 file
中找到的单词的字典,每个键都是一个单词,关联的值是该单词的计数。如果是这样,你的更新算法是错误的。你应该这样做:
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())
您应该将该代码放入一个函数中,这样当您想要使用 dict3
.
中的数据更新 dict1
时就不需要复制代码了
你应该看看 collections.Counter,它是 dict
的一个支持计数的子类;使用 Counter
s 会大大简化这项任务。但如果这是一项作业(或者您使用的是 Python 2.6 或更早版本),您可能无法使用 Counter
s.
也许我没有理解你的问题,但你是想把每个词典中的所有值加在一起成为一个最终的词典吗?如果是:
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}
这对 post 您的问题的预期结果非常有帮助。
编辑:
对于任意数量的字典:
result = dict(dicts[0])
for dict_sum in dicts[1:]:
add_dict(result, dict_sum)
print(result)
如果您真的想以以下格式修复原始问题中的代码:
- 你在使用
dict1[k]+=1
而你应该执行 dict1[k]+=dict2.get(k, 0)
。
get
的引入消除了使用 if 语句检查其存在的需要。
- 您需要遍历
dict2
和 dict3
以将它们中的新密钥引入 dict1
- (算不上什么问题,但值得一提)在if语句中判断key是否在字典中,建议简单操作到
if k in dict2:
(见this post更多详情)
有了@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
的子 class,因此可以像标准 dict
.[=26= 一样使用它]
嗯,这里有一个可能有用的简单函数:
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
... 对于交集,通过将第二个值添加到现有值来更新每个;然后为差异添加那些 key/value 对。
有了这个定义,你就可以简单地调用:
dictsum(dict1, dict2)
dictsum(dict1, dict3)
...并且要开心。
(我会注意到函数以这种方式修改字典的内容并不常见。我 returning None
明确地遵循 list.sort()
方法 ... 修改容器内容的函数,在 Python 中,通常不会 return 容器的副本)。
我创建了三个词典——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")
如果我正确理解了你的问题,那么你正在迭代错误的字典。您想要迭代 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
我假设 wordcount_file(file)
returns 是在 file
中找到的单词的字典,每个键都是一个单词,关联的值是该单词的计数。如果是这样,你的更新算法是错误的。你应该这样做:
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())
您应该将该代码放入一个函数中,这样当您想要使用 dict3
.
dict1
时就不需要复制代码了
你应该看看 collections.Counter,它是 dict
的一个支持计数的子类;使用 Counter
s 会大大简化这项任务。但如果这是一项作业(或者您使用的是 Python 2.6 或更早版本),您可能无法使用 Counter
s.
也许我没有理解你的问题,但你是想把每个词典中的所有值加在一起成为一个最终的词典吗?如果是:
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}
这对 post 您的问题的预期结果非常有帮助。
编辑:
对于任意数量的字典:
result = dict(dicts[0])
for dict_sum in dicts[1:]:
add_dict(result, dict_sum)
print(result)
如果您真的想以以下格式修复原始问题中的代码:
- 你在使用
dict1[k]+=1
而你应该执行dict1[k]+=dict2.get(k, 0)
。 get
的引入消除了使用 if 语句检查其存在的需要。- 您需要遍历
dict2
和dict3
以将它们中的新密钥引入dict1
- (算不上什么问题,但值得一提)在if语句中判断key是否在字典中,建议简单操作到
if k in dict2:
(见this post更多详情)
有了@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
的子 class,因此可以像标准 dict
.[=26= 一样使用它]
嗯,这里有一个可能有用的简单函数:
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
... 对于交集,通过将第二个值添加到现有值来更新每个;然后为差异添加那些 key/value 对。
有了这个定义,你就可以简单地调用:
dictsum(dict1, dict2)
dictsum(dict1, dict3)
...并且要开心。
(我会注意到函数以这种方式修改字典的内容并不常见。我 returning None
明确地遵循 list.sort()
方法 ... 修改容器内容的函数,在 Python 中,通常不会 return 容器的副本)。