обновить словарь в python из строки данных - PullRequest
0 голосов
/ 23 марта 2020

У меня есть скрипт, где я построчно читаю файл и сохраняю некоторую информацию в списки и словарь. А именно, я храню ключи (скажем, ley1 и key2) для передачи в словарь и список для сохранения в качестве элемента в словаре.

Бывает, что мне приходится обновлять словарь, только если выполнены некоторые условия , т.е.:

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

Конечно, это вызовет KeyError, если key2 еще не существует. Поэтому я ввел следующую функцию:

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

Мой вопрос: «безопасно» ли вызывать такую ​​функцию в основном коде внутри a для l oop, как это ?

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 способом и существуют ли более разумные решения.

1 Ответ

0 голосов
/ 23 марта 2020

Вместо доступа к первичному ключу используйте dict.setdefault с пустым значением по умолчанию dict.

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

Обратите внимание, что ваш первоначальный подход также безопасен. Только поиск, а не назначение, бросает KeyError. В операторе myDict[mykey1][mykey2] = myitems, KeyError может быть выброшено только из mykey1 не установлено. Таким образом, установка пустого dict на KeyError ничего не перезаписывает.

...