Чтение файловых элементов в список смежности - PullRequest
0 голосов
/ 16 мая 2018

У меня есть файл, содержащий:

0 1 95.21
0 2 43.8
1 3 10.4
2 5 67.1

и я пытаюсь создать из него список смежности. Где первые две линии представляют вершины, соединенные друг с другом, а 3-й столбец представляет длину ребра. Я хочу, чтобы python выдавал вывод как таковой:

[[1, 95.21],[2, 43.8]] #starting from 0, 0 connects to 1 of length 95.21, and 0 connects to 2 of length 43.8

[[0, 95.21],[3, 10.4]] #for 1, 1 also connects to 0 of length 95.21, and 1 connects to 3 of length 10.4

[[0, 43.8],[5, 67.1]]  #for 2, 2 also connects to 0 of length 43.8, and 2 connects to 5 of length 67.1

Мне удалось написать код, который создает список смежности:

filename2 = open("list.txt", "r", encoding = "utf-8")
efile = filename2

adjList = [0] * 10
for i in range(10):
    adjList[i] = []

for line in efile:
    edgeEndpoints = line.split()
    adjList[int(edgeEndpoints[0])].append(int(edgeEndpoints[1]))
    adjList[int(edgeEndpoints[1])].append(int(edgeEndpoints[0]))
print(adjList)

дает мне

[[1,2],[0,3],[0,5]]

но я не мог придумать, как включить длину ребра. Вместо [1,2] я хотел

[[[1, 95.21],[2, 43.8]],[[0, 95.21],[3, 10.4]],[[0, 43.8],[5, 67.1]]

Буду признателен за помощь в этом.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

В этом решении я пытался избежать необходимости заранее знать, сколько узлов находится в ваших данных.

>>> from collections import defaultdict
>>> adj_list = defaultdict(set)
>>> with open('list.txt') as f:
      for line in f:
        start,end,length = line.rstrip().split()
        adj_list[int(start)].add((int(end),float(length)))
        adj_list[int(end)].add((int(start),float(length)))

Это дает следующий результат

>>> for k,v in adj_list.items():
    print(k,":",v) 

0 : set([(2, 43.8), (1, 95.21)])
1 : set([(3, 10.4), (0, 95.21)])
2 : set([(0, 43.8), (5, 67.1)])
3 : set([(1, 10.4)])
5 : set([(2, 67.1)])
0 голосов
/ 16 мая 2018

Вместо append единственного целого числа вы должны append a list, который содержит как целое число, так и расстояние.

filename2 = open("list.txt", "r", encoding = "utf-8")
efile = filename2

adjList = [0] * 10
for i in range(10):
    adjList[i] = []

for line in efile:
    edgeEndpoints = line.split()
    adjList[int(edgeEndpoints[0])].append([int(edgeEndpoints[1]), float(edgeEndpoints[2])])
    adjList[int(edgeEndpoints[1])].append([int(edgeEndpoints[0]), float(edgeEndpoints[2])])
print(adjList)

дает вывод:

$ python3 adjtest.py
[[[1, 95.21], [2, 43.8]], [[0, 95.21], [3, 10.4]], [[0, 43.8], [5, 67.1]], [[1, 10.4]], [], [[2, 67.1]], [], [], [], []]

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

...