我正在为每行读取一个文件并为我的字典创建新条目:
假设解析和拆分后的第一行将有一个这样的条目:
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}}
然后,只要它在字典中显示现有密钥或者以新方式创建新条目,它就应该继续更新
答案 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
)。