Отделение указанных c значений из списка в python - PullRequest
0 голосов
/ 16 марта 2020

У меня есть список списков (называемый таблицей):

table = [[0, 1, 2], [1, 2, 1], [2, 3, 2], [0, 2, 3], [0, 3, 2], [1, 3, 3]]

, где первый элемент каждого подсписка является начальной точкой, второй - конечной точкой, а третий - расстоянием между двумя точки. Так, например, [0,1,2] означает, что разрыв между точкой 0 и 1 равен 2.

Теперь я хочу использовать информацию в таблице, чтобы построить другой список списков (называемых расстояниями), содержащий все расстояния между всеми точками. Чтобы я мог, например, назвать расстояния [0] [2] (имеется в виду, что мне нужно расстояние между точкой 0 и точкой 2, поэтому на выходе должно быть 3).

Однако у меня возникают проблемы с правильным разделением даты и таблицы и расстоянием между ними. Пока мой код такой:

dstFromOnePoint = []
distances = []
numberOfPoints = 4 #0,1,2,3
for i in range(numberOfPoints): #loops through all start points
    for j in range(numberOfPoints): # loops through all endpoints
        for val in table: 
            if (val[0] == i and val[1] == j) or (val[0] == j and val[1] == i): # checks start node , end node
                dst = val[2]
                dstFromOnePoint.append(dst)
            elif (i==j): #distance from one point to itself will be 0
                dstFromOnePoint.append(0)
    distances.append(dstFromOnePoint)
print(distances)
print(distances[0][2])

Вывод, который я получаю:

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

Вывод, который я должен получить:

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

Я думаю, что я неправильно использую свои циклы, потому что я заканчиваю тем, что добавляю один и тот же список несколько раз, но даже просто просматривая один отдельный подсписок, у меня нет правильных значений, поэтому у меня, вероятно, есть другие проблемы, которые я не знаю, как исправить?

Ответы [ 3 ]

4 голосов
/ 16 марта 2020

Вот правильное и более компактное решение:

numberOfPoints = 4
distances = [numberOfPoints * [0] for _ in range(numberOfPoints)]
for x, y, d in table:
   distances[x][y] = d
   distances[y][x] = d
2 голосов
/ 16 марта 2020

Необходимо предварительно заполнить матрицу расстояний, а затем назначить для [i] [j]

Исправления в исходных решениях:

table = [[0, 1, 2], [1, 2, 1], [2, 3, 2], [0, 2, 3], [0, 3, 2], [1, 3, 3]]

distances = []
numberOfPoints = 4 #0,1,2,3
distances = [[0 for _ in range(numberOfPoints)] for _ in range(numberOfPoints)]
for i in range(numberOfPoints): #loops through all start points
    for j in range(numberOfPoints): # loops through all endpoints
        for val in table:
            if (val[0] == i and val[1] == j) or (val[0] == j and val[1] == i): # checks start node , end node
                dst = val[2]
                distances[i][j] = dst
            # actually you can drop this elif as distances is intitalized to 0
            elif (i==j): #distance from one point to itself will be 0
                # dstFromOnePoint.append(0)
                distances[i][j] = 0
    # distances.append(dstFromOnePoint)
print(distances)
print(distances[0][2])

дает:

[[0, 2, 3, 2], [2, 0, 1, 3], [3, 1, 0, 2], [2, 3, 2, 0]]
3
0 голосов
/ 16 марта 2020

здесь одна строка с использованием itertools.groupby:

from itertools import groupby

[[next(g)[2] if j!=i else 0 for j in range(len(table[0]) + 1 )] for  i, (k, g) in enumerate(groupby(sorted(e for f, s, t in table for e in [[f, s, t], [s, f, t]]), key=lambda x: x[0]))]

вывод:

[[0, 2, 3, 2], [2, 0, 1, 3], [3, 1, 0, 2], [2, 3, 2, 0]]
...