2016-07-18 2 views
1

У меня есть CSV с первым столбцом, имеющим множество повторяющихся значений, а второй столбцом является предопределенным кодом, который отображает до значения в третьей колонке, например, следующим образом:Python - Создание словаря словарей из CSV

1, a, 24 
1, b, 13 
1, c, 30 
1, d, 0 
2, a, 1 
2, b, 12 
2, c, 82 
2, d, 81 
3, a, 04 
3, b, 23 
3, c, 74 
3, d, 50 

Я пытаюсь создать словарь словарей из в CSV, что приведет к следующему:

dict 1 = {'1':{'a':'24', 'b':'13', 'c':'30','d':'0'}, 
      '2':{'a':'1', 'b':'12', 'c':'82','d':'81'}, 
      ... } 

Мой код создает ключевые ценности просто отлично, но результирующее значение словари все пустые (хотя некоторые заявления печати показали, что они не во время выполнения сс) ...

with open(file, mode='rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 

    dict1 = {} # creates main dict 
    for row in reader: # iterates through the rows of the csvfile 
     if row[0] in dict1: 
      dict2[row[1]] = row[2] # adds another key, value to dict2 
     else: 
      dict1[row[0]] = {} # creates a new key entry for the new  dict1 key 
      dict2 = {} # creates a new dict2 to start building as the value for the new dict1 key 
      dict2[row[1]] = row[2] # adds the first key, value pair for dict2 
+0

Вы не назначили 'dict2' частью' dict1'. – PatNowak

ответ

2

Для этого используйте collections.defaultdict.

import collections 

with open(file, mode='rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 

    dict1 = collections.defaultdict(dict) 
    for row in reader: 
     dict1[row[0]][row[1]] = row[2] 

defaultdict не более чем словарь, который инициализирует значения для неизвестных ключей с дефолтом. Здесь по умолчанию используется инициализация второго, нового словаря (dict - конструктор словаря). Таким образом, вы можете легко установить оба отображения в одной строке.

2

Вам не нужно dict2 и вы не устанавливая его как значение ДИКТ в любом случае. Попробуйте эту измененную версию:

with open(file, mode='rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 

    dict1 = {} # creates main dict 
    for row in reader: # iterates through the rows of the csvfile 
     if row[0] not in dict1: 
      dict1[row[0]] = {} # creates a new key entry for the new dict1 key 
     dict1[row[0]][row[1]] = row[2] # adds another key, value to dict2 

Вы также можете использовать defaultdict, чтобы пропустить проверку существующих ключей.

+1

1 минута опаздывает. defaultdict отлично подходит для этого. – mhoff

+1

@MichaelHoff Я предлагаю вам восстановить ваш ответ, если он работает, потому что он продемонстрировал мой альтернативный метод с образцом кода. – Selcuk

+0

Вы правы. Он по-прежнему вносит свой вклад в ответ на этот вопрос, даже если его немного избыточно. – mhoff