Я пытаюсь реализовать список смежности, используя текстовый файл, который включает:

0,1,5,1,3,1,0,3,1,1,0,4,7,1,0,4,0,4,1,6,5,1,1,3,6,3,4,1,5,2
6,0,1,4,1,5,3,0,4,5,1,4,7,4,2,0,3,5,4,1,3,1,7,3,2,1,1,6,5,0
4,6,0,3,1,6,1,6,2,1,2,2,7,7,7,1,1,1,6,1,1,5,1,6,1,6,1,2,5,3
6,4,5,0,4,1,6,1,6,2,1,0,6,5,1,3,0,1,0,7,5,1,6,6,3,2,3,1,6,4
4,2,0,6,0,0,4,6,3,3,3,6,7,0,1,4,5,7,3,4,2,3,7,7,1,4,6,6,4,5
0,2,6,1,6,0,3,3,6,1,4,4,3,5,0,7,3,7,3,7,0,2,7,1,7,2,5,7,1,0
7,4,5,2,2,2,0,3,1,4,0,6,0,3,7,1,4,6,6,6,6,1,1,6,1,3,3,3,2,0
2,0,1,3,1,7,2,0,3,0,5,2,3,4,1,7,1,0,1,5,3,6,1,2,2,0,5,2,4,0
7,3,2,6,2,6,6,1,0,1,0,6,2,3,0,5,2,1,7,0,0,3,3,0,1,1,1,4,6,1
4,1,7,4,2,5,7,1,4,0,4,3,6,1,6,6,1,0,4,0,0,0,2,2,4,2,6,0,7,5
1,1,2,1,0,5,1,6,2,6,0,4,4,6,2,5,1,1,0,0,5,0,1,1,2,5,1,3,6,6
0,3,7,3,1,4,6,1,2,7,1,0,4,4,1,1,6,7,1,5,0,4,0,4,6,3,1,4,1,0
1,4,7,0,4,1,5,3,1,0,0,6,0,0,5,0,3,5,4,7,2,1,4,7,3,1,5,7,3,2
3,1,5,3,3,4,2,4,4,5,1,7,6,0,3,3,0,0,7,7,3,5,6,7,0,2,1,0,2,2
3,1,4,4,1,5,1,5,6,2,6,4,5,7,0,0,4,1,3,7,5,1,0,4,5,4,5,1,1,0

Подумайте, что каждая строка имеет номер индекса как имя вместо A, B, C .... Так, например, 0,1,5,1,3,1,0,3,1,1,0,4,7,1,0,4,0,4,1,6,5,1,1,3,6,3,4,1,5,2 - это узел 0, а 6,0,1,4,1,5,3,0,4,5,1,4,7,4,2,0,3,5,4,1,3,1,7,3,2,1,1,6,5,0 - это узел {{X3 }} и т. д. Проблема в том, что я не могу извлекать элементы из-за символа "," между каждым элементом. Я пробовал это:

a = np.array([])
with open("routers.txt") as f:
    adj_list = list(f)
    node_no = 0
    node_list = list()

    for i in adj_list:

        node_list.append(node_no)
        if i[node_no] != ",":
          a = np.append(a, i[node_no])
          node_no += 1
        elif i[node_no] == ",":
          break

Но он не может идти дальше, когда видит "," останавливается.

2
opia 14 Июн 2021 в 22:07

3 ответа

Лучший ответ

Вы можете использовать словарь и сохранить узел / индекс как ключ, а строку как значение:

file = open("file.txt")
raw_f = file.readlines()
d = {}
for line in raw_f:
    d|= {raw_f.index(line):line}

    
print(d)

Например: print(d[0]) даст вам первую строку в качестве вывода:

 0,1,5,1,3,1,0,3,1,1,0,4,7,1,0,4,0,4,1,6,5,1,1,3,6,3,4,1,5,2

Если вы хотите остаться со списком, используйте:

file = open("KontoN.txt")
raw_f = file.readlines()
res = []

for line in raw_f:
    res.append(line)

    
print(res)

Тогда:

print(res[0])

Даст тебе:

0,1,5,1,3,1,0,3,1,1,0,4,7,1,0,4,0,4,1,6,5,1,1,3,6,3,4,1,5,2

Для удаления , между числами вы можете использовать замену, например:

d|= {raw_f.index(line):line.replace(",","")}

Или для 2-го случая:

res.append(line.replace(",",""))

Чтобы выходные данные в обоих случаях d[0] и res[0] были:

015131031104710404165113634152

Я рекомендую использовать словари, потому что время поиска быстрее, чем время поиска в списках.

2
Aru 14 Июн 2021 в 19:42

Вы можете использовать сплит:

text = """0,1,5,1,3,1,0,3,1,1,0,4,7,1,0,4,0,4,1,6,5,1,1,3,6,3,4,1,5,2
6,0,1,4,1,5,3,0,4,5,1,4,7,4,2,0,3,5,4,1,3,1,7,3,2,1,1,6,5,0
4,6,0,3,1,6,1,6,2,1,2,2,7,7,7,1,1,1,6,1,1,5,1,6,1,6,1,2,5,3
6,4,5,0,4,1,6,1,6,2,1,0,6,5,1,3,0,1,0,7,5,1,6,6,3,2,3,1,6,4
4,2,0,6,0,0,4,6,3,3,3,6,7,0,1,4,5,7,3,4,2,3,7,7,1,4,6,6,4,5
0,2,6,1,6,0,3,3,6,1,4,4,3,5,0,7,3,7,3,7,0,2,7,1,7,2,5,7,1,0
7,4,5,2,2,2,0,3,1,4,0,6,0,3,7,1,4,6,6,6,6,1,1,6,1,3,3,3,2,0
2,0,1,3,1,7,2,0,3,0,5,2,3,4,1,7,1,0,1,5,3,6,1,2,2,0,5,2,4,0
7,3,2,6,2,6,6,1,0,1,0,6,2,3,0,5,2,1,7,0,0,3,3,0,1,1,1,4,6,1
4,1,7,4,2,5,7,1,4,0,4,3,6,1,6,6,1,0,4,0,0,0,2,2,4,2,6,0,7,5
1,1,2,1,0,5,1,6,2,6,0,4,4,6,2,5,1,1,0,0,5,0,1,1,2,5,1,3,6,6
0,3,7,3,1,4,6,1,2,7,1,0,4,4,1,1,6,7,1,5,0,4,0,4,6,3,1,4,1,0
1,4,7,0,4,1,5,3,1,0,0,6,0,0,5,0,3,5,4,7,2,1,4,7,3,1,5,7,3,2
3,1,5,3,3,4,2,4,4,5,1,7,6,0,3,3,0,0,7,7,3,5,6,7,0,2,1,0,2,2
3,1,4,4,1,5,1,5,6,2,6,4,5,7,0,0,4,1,3,7,5,1,0,4,5,4,5,1,1,0"""

lst = text.split('\n')

dct = dict()
for i, line in enumerate(lst):
    dct[i] = line.split(',')

print(dct[0])
#['0', '1', '5', '1', '3', '1', '0', '3', '1', '1', '0', '4', '7', '1', '0', '4', '0', '4', '1', '6', '5', '1', '1', '3', '6', '3', '4', '1', '5', '2']

Или одной строкой:

dct = {i: l.split(',') for i, l in enumerate(text.split('\n'))}
2
Andreas 14 Июн 2021 в 19:11

Если я правильно понимаю, вы пытаетесь прочитать строки файла в массив.

Вы можете сделать это с помощью str.split().

В твоем случае:

for line in f.readlines():
    a.append([int(i) for i in line.split(',')])
1
Adin Ackerman 14 Июн 2021 в 19:12