#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() создает новую запись (в данном случае пустой словарь), только если с данным ключом не связана такая запись. Затем он возвращает запись (либо вновь созданную пустую, либо существующую), поэтому мы добавляем в запись (которая является вложенным словарем) новое отношение.