在Python中更新字典

时间:2011-07-05 15:27:26

标签: python

我正在为每行读取一个文件并为我的字典创建新条目:

假设解析和拆分后的第一行将有一个这样的条目:

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}}

然后,只要它在字典中显示现有密钥或者以新方式创建新条目,它就应该继续更新

5 个答案:

答案 0 :(得分:2)

使用该文件的示例可以更容易地显示。但这很容易:

from collections import defaultdict
mydict = defaultdict(dict)
for line in file:
    for outerkey, innerkey, value in parseline(line):
        mydict[outerkey][innerkey] = value

如果"H"收到{"A":{"B":1, "H":10}}作为'H',则仍会覆盖innerkey中的{{1}}值,否则,它会按照您的指示行事。假设我理解你......

答案 1 :(得分:2)

请不要将'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)

答案 2 :(得分:1)

通过解析一行创建dict后,更新 master 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)

答案 3 :(得分:1)

try/except 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_dict_a_info是包含新信息的字典

修改:正如其他答案中所指出的,dict不是变量名称的好选择,因为它隐藏了内置dict

答案 4 :(得分:0)

import collections

result = collections.defaultdict(dict)
# fd = open(...)
while line in fd:
   key, value = parseline(line)
   result[key].update(value)

此外,不要对变量使用内置名称(dict)。