Как вы создаете вложенный dict в Python?

У меня есть 2 файла csv. Первый – это файл данных, а другой – файл сопоставления. Файл сопоставления имеет 4 столбца Device_Name GDN Device_Type Device_OS Это также столбцы, которые присутствуют в файле данных, и их необходимо обрабатывать.

Файл данных содержит данные с столбцом Device_Name, заполненным и остальным 3 столбцами. Файл сопоставления содержит все заполненные столбцы. Я хочу, чтобы мой код Python открыл оба файла и для каждого имени устройства в файле данных отображал его значение GDN, Device_Type & Device_OS из файла сопоставления.

Я знаю, как использовать dict, когда присутствуют только 2 столбца (1 необходимо сопоставить), но я не знаю, как это сделать, когда нужно сопоставить 3 столбца.

Ниже приведен код, с помощью которого я попытался выполнить сопоставление Device_Type :

 x = dict([]) with open("Pricing Mapping_2013-04-22.csv", "rb") as in_file1: file_map = csv.reader(in_file1, delimiter=',') for row in file_map: typemap = [row[0],row[2]] x.append(typemap) with open("Pricing_Updated_Cleaned.csv", "rb") as in_file2, open("Data Scraper_GDN.csv", "wb") as out_file: writer = csv.writer(out_file, delimiter=',') for row in csv.reader(in_file2, delimiter=','): try: row[27] = x[row[11]] except KeyError: row[27] = "" writer.writerow(row) 

Он возвращает Atribute Error .

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

  • Как указать, где открывается окно Tkinter?
  • Исключение исключения в менеджере контекста __enter __ ()
  • Как нажимать целую последовательность на redis в Python
  • Python 3 urllib создает TypeError: данные POST должны быть байтами или итерируемыми байтами. Это не может быть типа str
  • Python ищет файл для текста, используя ввод из другого файла
  • не удается установить matplotlib с помощью pip
  • From-Import при сохранении доступа по модулю
  • Python тот же символ не равен
  • 4 Solutions collect form web for “Как вы создаете вложенный dict в Python?”

    Вложенный dict – словарь в словаре. Очень простая вещь.

     >>> d = {} >>> d['dict1'] = {} >>> d['dict1']['innerkey'] = 'value' >>> d {'dict1': {'innerkey': 'value'}} 

    Вы также можете использовать defaultdict из пакета collections , чтобы облегчить создание вложенных словарей.

     >>> import collections >>> d = collections.defaultdict(dict) >>> d['dict1']['innerkey'] = 'value' >>> d # currently a defaultdict type defaultdict(<type 'dict'>, {'dict1': {'innerkey': 'value'}}) >>> dict(d) # but is exactly like a normal dictionary. {'dict1': {'innerkey': 'value'}} 

    Вы можете заполнить это, как хотите.

    Я бы порекомендовал в вашем коде что-то вроде следующего:

     d = {} # can use defaultdict(dict) instead for row in file_map: # derive row key from something # when using defaultdict, we can skip the next step creating a dictionary on row_key d[row_key] = {} for idx, col in enumerate(row): d[row_key][idx] = col 

    Согласно вашему комментарию :

    может быть выше кода, путает вопрос. Моя проблема в двух словах: у меня есть 2 файла a.csv b.csv, a.csv имеет 4 столбца ijkl, b.csv также имеет эти столбцы. i – это ключевые столбцы для этих csvs. Столбец jkl пуст в a.csv, но заполняется b.csv. Я хочу сопоставить значения столбцов jk l, используя «i» в качестве ключевого столбца из b.csv в файл a.csv

    Мое предложение было бы примерно таким (без использования defaultdict):

     a_file = "path/to/a.csv" b_file = "path/to/b.csv" # read from file a.csv with open(a_file) as f: # skip headers f.next() # get first colum as keys keys = (line.split(',')[0] for line in f) # create empty dictionary: d = {} # read from file b.csv with open(b_file) as f: # gather headers except first key header headers = f.next().split(',')[1:] # iterate lines for line in f: # gather the colums cols = line.strip().split(',') # check to make sure this key should be mapped. if cols[0] not in keys: continue # add key to dict d[cols[0]] = dict( # inner keys are the header names, values are columns (headers[idx], v) for idx, v in enumerate(cols[1:])) 

    Обратите внимание, что для разбора CSV-файлов есть модуль csv .

    UPDATE : для произвольной длины вложенного словаря перейдите к этому ответу .

    Используйте функцию defaultdict из коллекций.

    Высокая производительность: «если ключ не в dict» очень дорог, когда набор данных большой.

    Низкое обслуживание: сделать код более читаемым и его можно легко расширить.

     from collections import defaultdict target_dict = defaultdict(dict) target_dict[key1][key2] = val 

    Для произвольных уровней вложенности:

     In [2]: def nested_dict(): ...: return collections.defaultdict(nested_dict) ...: In [3]: a = nested_dict() In [4]: a Out[4]: defaultdict(<function __main__.nested_dict>, {}) In [5]: a['a']['b']['c'] = 1 In [6]: a Out[6]: defaultdict(<function __main__.nested_dict>, {'a': defaultdict(<function __main__.nested_dict>, {'b': defaultdict(<function __main__.nested_dict>, {'c': 1})})}) 

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

     import nested_dict as nd nest = nd.nested_dict() nest['outer1']['inner1'] = 'v11' nest['outer1']['inner2'] = 'v12' print('original nested dict: \n', nest) try: nest['outer1']['wrong_key1'] except KeyError as e: print('exception missing key', e) print('nested dict after lookup with missing key. no exception raised:\n', nest) # instead convert back to normal dict nest_d = nest.to_dict(nest) try: print('converted to normal dict. Trying to lookup Wrong_key2') nest_d['outer1']['wrong_key2'] except KeyError as e: print('exception missing key', e) else: print(' no exception raised:\n') # or use dict.keys to check if key in nested dict. print('checking with dict.keys') print(list(nest['outer1'].keys())) if 'wrong_key3' in list(nest.keys()): print('found wrong_key3') else: print(' did not find wrong_key3') 

    Выход:

     original nested dict: {"outer1": {"inner2": "v12", "inner1": "v11"}} nested dict after lookup with missing key. no exception raised: {"outer1": {"wrong_key1": {}, "inner2": "v12", "inner1": "v11"}} converted to normal dict. Trying to lookup Wrong_key2 exception missing key 'wrong_key2' checking with dict.keys ['wrong_key1', 'inner2', 'inner1'] did not find wrong_key3 
    Interesting Posts

    Как сохранить статистику tshark в переменных

    'pip setup.py bdist_wheel' больше не строит принудительные нечистые колеса

    Разница между asfreq и resample

    Разница во времени между методами set.discard и set.remove в Python?

    Финансовый технический анализ в python

    Лучшая практика лесозаготовки в Django Celery

    Как предотвратить конфликты приборов с конфликтом с сигнальным кодом django post_save?

    ошибки синтаксиса журнала и неперехваченные исключения для подпроцесса python и распечатать их на терминале

    Количество глаголов, существительных и других частей речи с помощью NLTK python

    Почему в itertools.permutations Python содержатся дубликаты? (Когда исходный список имеет дубликаты)

    класс __init __ () принимает ровно 2 аргумента (1 данный)

    Странная рекомендация PEP8 при сравнении логических значений с True или False

    Что такое тип данных для пакета глубокого обучения Python Keras?

    Графический график Matplotlib от значений в pandas DataFrame

    Несколько цифр в одном окне

    Python - лучший язык программирования в мире.