Создание вложенного словаря с помощью python

#python #dictionary #hyperlink #nodes

#python #словарь #гиперссылка #узлы

Вопрос:

У меня есть данные для узлов в формате csv. Я хочу создать словарь для анализа. Имеющиеся у меня данные выглядят следующим образом

 Init node   Term node   Capacity 
   1    2   25900.20064
   1    3   23403.47319
   2    1   25900.20064
   2    6   4958.180928
   3    1   23403.47319
   3    4   17110.52372
   3    12  23403.47319
   4    3   17110.52372
   4    5   17782.7941
 

Таким образом, один узел подключен к другому узлу, имеющему некоторую емкость. Итак, мне нужен словарь на python, который создает такие данные

 graph = {'1': {'2': 25900.20064, '3': 23403.47319},
         '2': {'1': 25900.20064, '6':4958.180928},
         '3': {'1': 23403.47319, '4'}}
 

Я попробовал следующий код, чтобы сделать это..

 import xlrd
file_location = "C:/Users/12/Desktop/SiouxFalls_net1.xlsx"
workbook = xlrd.open_workbook(file_location)
sheet = workbook.sheet_by_index(0)
dict = {}
z = {}


for rows in range(sheet.nrows):
    a = sheet.cell_value(rows,0)
    dict[a] = {}
    for rows in range(sheet.nrows):
        b = sheet.cell_value(rows,1)
        c = sheet.cell_value(rows, 2)
        dict[a][b] = c
 

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

 print(dict)
 

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

1. dict это встроенный тип, поэтому эту переменную следует переименовать. Кроме того, не могли бы вы также проверить отступ второго цикла for? Я подозреваю, что копирование-вставка, возможно, испортила отступ второго цикла.

2. Да, отступ здесь неправильный, но я не получаю правильный словарь. Я просто хочу знать, возможно ли создать в нужном формате

Ответ №1:

Попробуйте этот цикл:

 sheet = workbook.sheet_by_index(0)
d = {}
for rows in range(sheet.nrows):
    a = sheet.cell_value(rows, 0)
    b = sheet.cell_value(rows, 1)
    c = sheet.cell_value(rows, 2)

    d.setdefault(a, {})[b] = c
    d.setdefault(b, {})[a] = c
 

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

1. Да, это работает. Спасибо! в большинстве случаев вы принимаете значения a и пытаетесь создать пустой dict внутри d, а затем снова делаете то же самое с b . Я прав?

2. setdefault создаст dict со значением по умолчанию (в данном случае пустой dict), если он еще не создан

3. Правильно, setdefault() создает новую запись (в данном случае пустой словарь), только если с данным ключом не связана такая запись. Затем он возвращает запись (либо вновь созданную пустую, либо существующую), поэтому мы добавляем в запись (которая является вложенным словарем) новое отношение.