Python - как создать словарь словаря в цикле - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь создать граф городов из файла.Каждый readline() Я получаю три значения, a, b и c.a и b - это строки, названия городов, а c - это int, стоимость пути между a и b.Как я могу сохранить a, b, c, чтобы получить что-то вроде

graph = {
          'a1': {'b1': c1, 'b1': 5, 'a2': c2},
          'a2': {'a1': c2},
          'b1': {'a1': c1},
        }

Вот часть моего кода:

dict = dict()   #dictionary for storing values
while (True):
    new_path = file.readline()
    if new_path == "":
        break
    new_path = new_path.rstrip().split(", ")
    a = new_path[0][2:len(new_path[0]) - 1] #start town
    b = new_path[1][1:len(new_path[1]) - 1] #end town
    c = new_path[2][0:len(new_path[2]) - 1] #path cost
    print(a+" "+b+" "+c)   #this prints Arlington Chelmsford 4

....... Так как я не знаю, есть ли ключ в словаре, я попытался добавить ключ с пустым значением, если ключ не в dict.keys(), но тогда update() будет работать странно и даст мне какое-тосписок.Я новичок в Python, поэтому, пожалуйста, объясните мне, как создать такой график, в котором нет символа []. Спасибо, миллион !!

конечный результат, который я хочу, будет примерно таким:

{'Arlington': {'Chelmsford': 4, 'Berkshire': 10}, 'Chelmsford': {'Arlington': 4, 'Berkshire': 5}, 'Berkshire': {'Arlington': 10, 'Chelmsford': 5}}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вот пример использования встроенных библиотек.defaultdict проверяет, что если ключ отсутствует в словаре, он создается со значением по умолчанию ... в данном случае это пустой словарь.Модуль csv может использоваться для считывания и анализа ввода через запятую.

from collections import defaultdict
import csv

D = defaultdict(dict)

with open('input.csv',newline='') as f:
    r = csv.reader(f)
    for a,b,c in r:
        D[a][b] = int(c)
        D[b][a] = int(c)

print(dict(D)) # dict() is unnecessary, but prints better than the defaultdict object

Вход:

Arlington,Chelmsford,4
Arlington,Berkshire,10
Chelmsford,Berkshire,5

Выход:

{'Arlington': {'Chelmsford': 4, 'Berkshire': 10}, 'Chelmsford': {'Arlington': 4, 'Berkshire': 5}, 'Berkshire': {'Arlington': 10, 'Chelmsford': 5}}
0 голосов
/ 26 сентября 2018

Вы можете использовать следующий цикл, который устанавливает диктат graph в обоих направлениях:

graph = {}
for line in file:
    a, b, c = line.rstrip().split(', ')
    graph.setdefault(a, {})[b] = c
    graph.setdefault(b, {})[a] = c

так, чтобы данное содержимое файла:

Arlington, Chelmsford, 4
Arlington, Berkshire, 10
Chelmsford, Berkshire, 5

graph стало бы:

{'Arlington': {'Chelmsford': '4', 'Berkshire': '10'}, 'Chelmsford': {'Arlington': '4', 'Berkshire': '5'}, 'Berkshire': {'Arlington': '10', 'Chelmsford': '5'}}

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