从行数据更新python中的字典

2024-09-28 22:30:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,我逐行读取文件,并将一些信息保存到列表和字典中。也就是说,我存储了要传递给字典的键(比如ley1和key2),以及一个要作为项存储在字典中的列表

只有在满足某些条件的情况下,我才需要更新字典,例如:

myDict = {}
if mylist:
    myDict[key1][key2] = mylist

当然,如果key2不存在,这将引发KeyError。因此,我引入了以下功能:

def updateDict2keys(myDict,mykey1,mykey2,myitems):
    """
    updates a dictionary by appending values at given keys (generating key2 if not given)
    input: key1, key2 and items to append
    output: dictionary orgnanized as {mykey1:{mykey2:myitems}}
    """
    try:
        myDict[mykey1][mykey2] = myitems
    except KeyError:
        myDict[mykey1] = {mykey2:myitems}
    # output
    return myDict

我的问题是:像这样在for循环中的主代码中调用这样的函数“安全”吗

with open(os.path.join(path+myfile)) as ntwkf:
    # read file
    rdlistcsv = csv.reader(ntwkf)
    rowslist  = [line for line in rdlistcsv]
ntwkJuncDict = {}
for idx,f in enumerate(rowslist): # loop over file lines
    if f:
        lineelmnt = f[0].split()[0]
    else:
        continue
    # flags
    isBranchName = True if lineelmnt=='definitions' else False
    isJunction = True if lineelmnt=='connections' else False
    # update dictionary
    if isBranchName:
        reachname = f[0].split()[2].replace("'","")
    if isJunction:
        usreach = f[0].split()[2].replace("'","")
        uschain = float(f[1].replace("'","").replace(" ",""))
        if usreach: 
            uslist = [usreach, uschain]
            todivide.append(uslist)
            ntwkJuncDict = updateDict2keys(ntwkJuncDict, reachname, 'upstream', uslist)

我必须说,我的代码运行得很好,我只是问我自己(当然还有你们自己!)我是否用python的方式做每件事,是否有更智能的解决方案


Tags: fordictionaryif字典elsemydictreplacesplit
1条回答
网友
1楼 · 发布于 2024-09-28 22:30:38

不要访问主键,而是使用dict.setdefault和默认的空dict

def updateDict2keys(myDict,mykey1,mykey2,myitems):
    myDict.setdefault(mykey1, {})[mykey2] = myitems
    return myDict

请注意,您的初始方法也是安全的。只有查找而不是赋值抛出KeyError。在语句myDict[mykey1][mykey2] = myitems中,如果未设置mykey1,则只能抛出KeyError。因此,在KeyError上将其设置为空的dict不会覆盖任何内容

相关问题 更多 >