Создание вложенного словаря из списка кортежей

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

Это то, что я пробовал, но это не дает мне вложенного словаря, который я хотел.

data = [(37043, 2862826), (37043,2850223), (37107,2847978), (37107,2848001), (37107,2844725)]

data_dict = defaultdict(list)
for key, value in data:
    value = {value:1}
    data_dict[key].append(value)

print (data_dict)
>>> defaultdict(<class 'list'>, {37043: [{2862826: 1}, {2850223: 1}], 37107: [{2847978: 1}, {2848001: 1}, {2844725: 1}]})

data_dict = defaultdict(dict)    
for key, value in data:
    value = {value:1}
    data_dict[key] = value

print (data_dict)
>>> defaultdict(<class 'dict'>, {37043: {2850223: 1}, 37107: {2844725: 1}})

Желаемый результат:

 {37043: {2862826: 1, 2850223: 1}, 37107: {2847978:1, 2848001: 1, 2844725: 1}}

person Cryssie    schedule 26.01.2016    source источник


Ответы (3)


Как насчет использования defaultdict(dict):

>>> data_dict = defaultdict(dict)
>>> for key, value in data:
...     data_dict[key][value] = 1
... 
>>> data_dict
defaultdict(<type 'dict'>, {37043: {2862826: 1, 2850223: 1}, 37107: {2848001: 1, 2847978: 1, 2844725: 1}})
person alecxe    schedule 26.01.2016
comment
Документация по Defaultdict: docs.python.org/2/library/ - person schoetbi; 26.01.2016

Следующее делает с простым назначением ключ-значение:

data = [(37043, 2862826), (37043,2850223), (37107,2847978), (37107,2848001), (37107,2844725)]
output = {}
for key,value in data:
  if key in output:
    if value in output[key]: output[key][value] += 1
    else: output[key][value] = 1
  else: output[key] = {value:1}

Выход:

{37043: {2862826: 1, 2850223: 1}, 37107: {2848001: 1, 2847978: 1, 2844725: 1}}
person MervS    schedule 26.01.2016

Код ниже подойдет вам:

data = [(37043, 2862826), (37043,2850223), (37107,2847978), (37107,2848001), (37107,2844725)]

data_map = {}
for key, value in data:
    data_map.setdefault(key, {})
    data_map[key][value] = 1

print data_map
# {37043: {2862826: 1, 2850223: 1}, 37107: {2848001: 1, 2847978: 1, 2844725: 1}}

Ссылка на setdefault документацию по методу.

person Andriy Ivaneyko    schedule 26.01.2016
comment
Может быть data_map.setdefault(key, {})[value] = 1. - person Stefan Pochmann; 26.01.2016