Как добавить новую строку в словарь из нескольких элементов с одним и тем же ключом? - PullRequest
0 голосов
/ 02 июня 2019

Я работаю со списком CSV, который имеет приблизительно 7000 элементов, и у него есть определенные ключи, но я хочу создать функцию, которая может добавить новую строку к нему, которая получается путем деления цены на вес и затем сортируйте элементы по этому номеру.

У меня уже есть номер (цена / вес), я сделал это с помощью цикла for:

def ideal(dictionary):
    list2=list(dictionary)
    for x in range (len(list2)):
        Keys=list(dictionary[list2[x]])
        dict2=dictionary[list2[x]]
        column=list(map(dict2.get,Keys))
        newkey=(float(column[1]))/(float(column[2]))

Я попытался создать цикл for, чтобы вставить новую строку. Формат словаря выглядит следующим образом:

'chips': {'category': 'food', 'price': '345.0', 'weight[kg]': '0.2',
'volume[m3]': '0.5545'}, 'broccoli': {'category': 'food', 'price': '449.0',
'weight[kg]': '2.72', 'volume[m3]': '0.5492'}, 'ham': {'category': 'food',
'price': '680.0', 'weight[kg]': '22.57', 'volume[m3]': '0.1359'}
}

Есть еще категории, например: бакалея

def ideal(dictionary):
    ####newkey is a float
    copy=dictionary
    for x in copy:
        dictionary.update( {"newkey":newkey})

Но я получаю эту ошибку.

RuntimeError: размер словаря изменился во время итерации

Ответы [ 3 ]

1 голос
/ 02 июня 2019

copy=dictionary не делает копию, но делает copy ссылку на dictionary, следовательно, ошибка RuntimeError: dictionary changed size during iteration, так как вы изменяете словарь, повторяя его

Вместо того, чтобы сделать копию, которую вы хотите сделать copy=dictionary.copy() Затем вы можете перебирать словарь и обновлять вложенный словарь

def ideal(dictionary, newkey_list):
    #Make copy of dictionary
    copy=dictionary.copy()

    #Iterate through the dictionary
    for idx, value in enumerate(copy.values()):
        #Update nested dictionary with appropriate newkey
        value.update( {"newkey":newkey_list[idx]})
0 голосов
/ 02 июня 2019

Вы можете заменить ideal() на понимание слова:

ideal_dict = {k: {**v, "new_key": v["old_key"] ** 2} for k, v in old_dict.items()}

Или, если вы хотите обновить старый словарь:

old_dict.update({k: {**v, "new_key": v["old_key"] ** 2} for k, v in old_dict.items()})

PS Это должно быть быстрее.

0 голосов
/ 02 июня 2019

Если ваш dict содержит вложенные dict с, вам нужно изменить внешний, а не внешний:

for key in copy:
    copy[key].update({'newkey': newkey})

Как указано в других ответах, для создания копии используйте:

copy = dictionary.copy()

Хотя может быть лучше использовать copy.deepcopy(), поскольку у вас есть вложенные словари.

...