Создать вложенный словарь в Python - PullRequest
0 голосов
/ 02 мая 2020

Я создал словарь Father 'Father_dict' , в котором я храню данные типа списка, но я ищу, чтобы эти данные были сохранены в качестве ключа другого словаря (в конечном счете, своего рода вложенного словарь).

#            SubKey            Key
data_input = [[ 1,     'Col',   1,    'TWO',    450],  
              [ 2,     'Col',   1,    'TWO',    450],   
              [ 3,     'Col',   1,    'TWO',    450],   
              [ 4,     'Col',   2,    'TWO',    400],
              [ 5,     'Col',   2,    'TWO',    400],  
              [ 6,     'Col',   2,    'TWO',    400],   
              [ 7,     'Col',   3,    'TWO',    300],
              [ 8,     'Col',   3,    'TWO',    300],
              [ 9,     'Col',   3,    'TWO',    300]] 
cc_list = []
father_dict = {}

for i in range(len(data_input)): 
    if data_input[i][1] == 'Col':
        cc_list.append(data_input[i][2]) #--> key list
flat_list = list(set(cc_list)) #--> Key flat

for j in flat_list:
    father_dict[j] = []

for i in range(len(data_input)):
    if data_input[i][1] == 'Col':
        key = data_input[i][2]
        father_dict[key].append(data_input[i][0])
print('\n', 'Father Dict ')
print(father_dict)      

Проблема заключается в том, что при замене 'Father_dict [j] = [] на {}' я получаю ошибку атрибута, поскольку в словарях метод добавления не может быть После применения я попробовал некоторые вещи, такие как сопоставление 'Father_dict [ключ] = data_input [i] [0]' , но оно также не работает.

То, что я ищу в том, что при печати на экране это возвращает:

 Father Dict 
{1: {1:, 2:, 3:}, 2: {4:, 5:, 6:}, 3: {7:, 8:, 9:}}

Есть ли какой-нибудь метод, который работает для этих случаев, спасибо?

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Да, вы можете использовать defaultdict. Это как словарь, за исключением того, что вы можете предоставить значение по умолчанию для любого ключа, который не существует. Если вы укажете «dict» в качестве значения по умолчанию, то вы можете легко установить ключи и субдискретарии создаются по требованию.

Вот ваш код с использованием defaultdict:

from collections import defaultdict
import json

#            SubKey            Key
data_input = [[ 1,     'Col',   1,    'TWO',    450],  
              [ 2,     'Col',   1,    'TWO',    450],   
              [ 3,     'Col',   1,    'TWO',    450],   
              [ 4,     'Col',   2,    'TWO',    400],
              [ 5,     'Col',   2,    'TWO',    400],  
              [ 6,     'Col',   2,    'TWO',    400],   
              [ 7,     'Col',   3,    'TWO',    300],
              [ 8,     'Col',   3,    'TWO',    300],
              [ 9,     'Col',   3,    'TWO',    300]] 
cc_list = []
father_dict = defaultdict(dict)

for i in range(len(data_input)): 
    if data_input[i][1] == 'Col':
        cc_list.append(data_input[i][2]) #--> key list
flat_list = list(set(cc_list)) #--> Key flat

for i in range(len(data_input)):
    if data_input[i][1] == 'Col':
        key = data_input[i][2]
        father_dict[key][data_input[i][0]] = None
print('\n', 'Father Dict ')
print(json.dumps(father_dict).replace(" null", "").replace('"', ''))  

Распечатка результата было не так удобно, и, вероятно, есть лучший способ, который мне было лень найти, но, надеюсь, вы поняли.

0 голосов
/ 02 мая 2020

С этим изменением ваш отец_дикт будет содержать элементы, которые сами являются словарями. Это означает, что

father_dict[key]

возвращает словарь, а не список. Итак, если вы хотите установить что-то в этом словаре, используйте

father_dict[key][j] = something

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...