用Python更新字典
我正在每行读取一个文件,并为我的字典创建新条目: 假设解析和拆分后的第一行有如下条目:用Python更新字典,python,Python,我正在每行读取一个文件,并为我的字典创建新条目: 假设解析和拆分后的第一行有如下条目: dict = {"A":{"B":1}, "G":{"P":2}}.... 然后我继续到第2行,说有一行任意的行可以读: 两个键“A”和“G”再次出现,它们是另一个值项: 假设第二行包含: dict = {"A":{"H":10}, "G":{"L":5}}.... 现在我的问题是,每当我的程序读取文件而不是重置为现有密钥存储的信息时,比如“a”、“G”。我想用这个来代替: dict = {"A":{"B
dict = {"A":{"B":1}, "G":{"P":2}}....
然后我继续到第2行,说有一行任意的行可以读:
两个键“A”和“G”再次出现,它们是另一个值项:
假设第二行包含:
dict = {"A":{"H":10}, "G":{"L":5}}....
现在我的问题是,每当我的程序读取文件而不是重置为现有密钥存储的信息时,比如“a”、“G”。我想用这个来代替:
dict = {"A":{"B":1,"H":10}, "G":{"P":2,"L":5}}
然后,每当它在字典中指出一个现有的键或创建一个新条目时,它应该不断更新。否则,当您通过解析一行来创建dict时,更新您的主dict,如下所示:
master = {}
master.setdefault('A', {}).update({'B':1})
# {'A': {'A': 1}}
master.setdefault('A', {}).update({'H':10})
# {'A': {'A': 1, 'H': 10}}
master.setdefault('G', {}).update({'P':2})
# {'A': {'A': 1, 'H': 10}, 'G': {'P': 2}}
master.setdefault('G', {}).update({'L':5})
# {'A': {'A': 1, 'H': 10}, 'G': {'L': 5, 'P': 10}}
或者,您可以使用defaultdict:
from collections import defaultdict
master = defaultdict(dict)
master['A'].update({'B': 1})
因此,您的代码将类似于:
infile = open('myfile')
master = {}
for line in infile:
# parse the line
d = {'A': {'B': 1}}
for k, v in d.iteritems():
master.setdefault(k, {}).update(v)
您可以在
KeyError
上尝试/排除,如下所示:
try:
mydict["A"].update(new_dict_a_info) #try to update existing "A" dictionary
except KeyError:
mydict["A"] = new_dict_a_info # "A" dictionary wasn't in dict
其中new\u dict\u a\u info
是包含您的新信息的词典
Edit:正如其他答案中指出的那样,dict
对于变量名不是一个好的选择,因为它隐藏了内置的dict这将更容易通过文件示例显示出来。但这很容易:
from collections import defaultdict
mydict = defaultdict(dict)
for line in file:
for outerkey, innerkey, value in parseline(line):
mydict[outerkey][innerkey] = value
这仍然会覆盖{“A”:{“B”:1,“H”:10}
中的“H”
值,如果它作为内键
接收到'H'
,否则,它将按照您的指示运行。假设我理解你…请不要使用'dict'作为变量名
您还可以使用以下代码:
a = {"A":{"B":1}, "G":{"P":2}}
b = {"A":{"H":10}, "G":{"L":5}}
def append_to_dict(dataDict, dictToAppend):
for k,v in dictToAppend.iteritems():
if k in dataDict:
dataDict[k].update(v)
else:
dataDict[k] = v
return dataDict
print append_to_dict(a,b)
另外,不要为变量使用内置名称(dict
)。如前所述,确保不要将dict
用作变量名,即使在这种情况下它只是一个变量名。
import collections
result = collections.defaultdict(dict)
# fd = open(...)
while line in fd:
key, value = parseline(line)
result[key].update(value)