уменьшить списки, учитывая одно значение 2d списков - PullRequest
0 голосов
/ 29 октября 2018

У меня есть 2 списка:

edges = [[0,1],[0,2],[0,3],[1,2],[1,3]]
weight = [10,8,7,3,7]

ребра представляет список ребер, соединяющих 2 узла вместе с соответствующим весом.

для заданных начальных узлов, как на ребрах [i] [0] Я хочу выбрать самую короткую точку соединения с учетом веса, поэтому в этом случае результат будет выглядеть следующим образом:

connect = [[0,3],[1,2]]
weight = [7,3]

Поскольку из всех узлов, подключенных к 0, 3 является ближайшим, а для 1, 2 - ближайшим.

Я не могу сформулировать проблему, любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Другое решение с использованием Pandas:

df = pd.DataFrame(edges, columns=['start','end'])
df['weight'] = weight
df.loc[df.groupby('start')['weight'].idxmin()]

С результатами:

start   end weight
0       3   7
1       2   3
0 голосов
/ 29 октября 2018
edges = [[0,1],[0,2],[0,3],[1,2],[1,3]]
weight = [10,8,7,3,7]

connect = []
wght = []

In [8]: for i in set(e[0] for e in edges):
...:     temp = [(a, b) for a, b in zip(edges, weight) if a[0] == i]
...:     temp = min(temp, key=lambda x: x[1])
...:     connect += [temp[0]]
...:     wght += [temp[1]]

In [9]: connect
Out[9]: [[0, 3], [1, 2]]

In [10]: wght
Out[10]: [7, 3]

Если вы находитесь в одном лайнере:

In [20]: [min([(a, b) for a, b in zip(edges, weight) if a[0] == i], key=lambda x: x[1]) fo
...: r i in set([e[0] for e in edges])]
Out[20]: [([0, 3], 7), ([1, 2], 3)]
...