Вы можете использовать itertools.product
для генерации комбинаций клавиш с каждым связанным подсписком.Если вы отсортируете и распакуете строковые компоненты каждой комбинации, то вы получите начальный вывод, который вы ищете.Оттуда вы можете отсортировать весь список сначала по значению веса, а затем по вершинам, чтобы получить упорядоченный список.Если вы нарежете этот список значением шага, вы можете удалить дубликаты.Затем вы можете просто удалить значение веса, чтобы получить список пар для вашего окончательного результата.
Вы можете объединить шаги, приведенные ниже, чуть подробнее, но это проходит через шаги, описанные в вашем вопросе, чтобы, надеюсь, сделать этонемного легче следовать.
from itertools import product
from operator import itemgetter
d = {"A": [["B",10], ["D",5]], "B": [["A",10], ["C",5]], "C": [["B",5],["D",15]], "D": [["C",15], ["A",5]]}
combos = [[*sorted([c1, c2]), n] for k, v in d.items() for c1, [c2, n] in product(k, v)]
print(combos)
# [['A', 'B', 10], ['A', 'D', 5], ['A', 'B', 10], ['B', 'C', 5], ['B', 'C', 5], ['C', 'D', 15], ['C', 'D', 15], ['A', 'D', 5]]
ordered = sorted(combos, key=itemgetter(2, 0, 1))[::2]
print(ordered)
# [['A', 'D', 5], ['B', 'C', 5], ['A', 'B', 10], ['C', 'D', 15]]
pairs = [o[:-1] for o in ordered]
print(pairs)
# [['A', 'D'], ['B', 'C'], ['A', 'B'], ['C', 'D']]
РЕДАКТИРОВАТЬ (без импорта):
Для комментария подчеркивается ограничение на использование импорта в вашем решении, вот измененная версия оригинала.Различия заключаются в замене itertools.product
пониманием списка, которое выполняет то же самое, и замене operator.itemgetter
на лямбду.
d = {"A": [["B",10], ["D",5]], "B": [["A",10], ["C",5]], "C": [["B",5],["D",15]], "D": [["C",15], ["A",5]]}
combos = [[*sorted([k, c]), n] for k, v in d.items() for c, n in v]
print(combos)
# [['A', 'B', 10], ['A', 'D', 5], ['A', 'B', 10], ['B', 'C', 5], ['B', 'C', 5], ['C', 'D', 15], ['C', 'D', 15], ['A', 'D', 5]]
ordered = sorted(combos, key=lambda x: (x[2], x[0], x[1]))[::2]
print(ordered)
# [['A', 'D', 5], ['B', 'C', 5], ['A', 'B', 10], ['C', 'D', 15]]
pairs = [o[:-1] for o in ordered]
print(pairs)
# [['A', 'D'], ['B', 'C'], ['A', 'B'], ['C', 'D']]