Как избежать посещения узлов по списку Python - PullRequest
0 голосов
/ 25 февраля 2020

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

например, если есть (1,2), (2,1) не должно быть в списке. если (2,1) напечатано, (1,2) не должно быть напечатано. Пожалуйста, помогите мне решить эту проблему. Я хочу сделать это без itertools. есть ли способ сделать это внутри этого l oop?

startnodes = [0,1,2,3,4]
endnodes = [0,1,2,3,4]

arb =[(x,z)  for x in startnodes for z in endnodes if x!=z]
print(arb)

Ответы [ 3 ]

0 голосов
/ 25 февраля 2020

Может быть что-то вроде:

import itertools

startnodes = [0, 1, 2, 3, 4]
endnodes = [0, 1, 2, 3, 4]

combinations = list(itertools.product(startnodes, endnodes))
done = []
results = []
for comb in combinations:
    if comb[0] != comb[1] and sorted(comb) not in done:
        done.append(sorted(comb))
        results.append(comb)
print(results)

Другой список done используется для отслеживания, какие комбинации сделаны. Если вы не возражаете против заказа, в этом нет необходимости, вы можете использовать results, добавляя отсортированные комбинации.

0 голосов
/ 25 февраля 2020

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

startnodes = [0,1,2,3,4]
endnodes = [0,1,2,3,4]

result ={tuple(sorted([x,z]))  for x in startnodes for y in endnodes if x!=y}
print(result)
0 голосов
/ 25 февраля 2020

Вы можете попробовать это,

startnodes = [0, 1, 2, 3, 4]
endnodes = [0, 1, 2, 3, 4]

import itertools

arb = []
for x, y in itertools.product(startnodes, endnodes):
    if x != y and (y, x) not in arb:
        arb.append((x, y))

print(arb)

Вывод,

[(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...