Слияние значений словаря Python на основе определенного ключа

#python

#питон

Вопрос:

Я хочу объединить два CSV-файла, которые я прочитал, в python, используя следующий код,

 a = csv.DictReader(csv1)
b = csv.DictReader(csv2)

aMap = {}
bMap = {}

for row in a:
    aMap[row['id']] = row

for row in b:
    bMap[row['id']] = row
 

Теперь у меня должно быть два словаря, ключами которых являются поля «id» из двух CSV. То, что я хочу сделать, это взять все из aMap и добавить значения к соответствующим значениям ключа в bMap. Например, в aMap ключ в словаре выглядит следующим образом,

 '123456' : {'name': 'SomeName', 'type': 'someType'}
 

И то, что у меня есть в bMap, это

 '123456' : {'location' : 'someLocation'}
 

И то, что я хочу, это,

 '123456' : {'location' : 'someLocation', 'name' : 'SomeName', 'type' : 'someType'}
 

Существует ли для этого конкретная функция или мне нужно создать новый словарь? Что-то похожее на update(), но просто добавляющее значения вместо обновления.

Ответ №1:

Вы могли бы использовать его collections.defaultdict и использовать update для объединения строк из csv2.

 import collections

aMap = collections.defaultdict(dict)

for row in csv.DictReader(csv1):
    aMap[row['id']] = row

for row in csv.DictReader(csv2):
    aMap[row['id']].update(row)
 

Ответ №2:

Я не думаю, что для этого есть встроенная функция. Итак, вам нужно будет сделать что-то вроде

 def AppendToValues(from_map, to_map):
  for key in from_map:
    to_map[key] = to_map.get(key, {})
    to_map.update(from_map.get(key, {}))
 

Чтобы удалить ключ, значение из карты:

 del my_map[key]
 

Комментарии:

1. Ах, шары, я так и думал. =/ Я попробую вашу функцию и посмотрю, как она работает 🙂

Ответ №3:

Я полагаю, что для этого вы можете использовать defaultdict в модуле collections . http://docs.python.org/library/collections.html#collections.defaultdict

Я думаю, что примеры довольно близки к тому, что вы хотите.