用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)