Erstens: Einfuhr itertools
:
import itertools
Permutation (die Reihenfolge ist wichtig):
print(list(itertools.permutations([1,2,3,4], 2)))
[(1, 2), (1, 3), (1, 4),
(2, 1), (2, 3), (2, 4),
(3, 1), (3, 2), (3, 4),
(4, 1), (4, 2), (4, 3)]
Kombination (die Reihenfolge spielt KEINE Rolle):
print(list(itertools.combinations('123', 2)))
[('1', '2'), ('1', '3'), ('2', '3')]
Kartesisches Produkt (mit mehreren Iterablen):
print(list(itertools.product([1,2,3], [4,5,6])))
[(1, 4), (1, 5), (1, 6),
(2, 4), (2, 5), (2, 6),
(3, 4), (3, 5), (3, 6)]
Kartesisches Produkt (mit einem Iterablen und sich selbst):
print(list(itertools.product([1,2], repeat=3)))
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
9 Stimmen
Ich stimme mit der rekursiven, akzeptierten Antwort überein - HEUTE. Das Problem ist jedoch immer noch ein großes Problem der Informatik. Die akzeptierte Antwort löst dieses Problem mit exponentieller Komplexität (2^N N=len(list)) Lösen Sie es (oder beweisen Sie, dass Sie es nicht können) in Polynomialzeit :) Siehe "Travelling-Salesman-Problem".
60 Stimmen
@FlipMcF Es wird schwierig sein, es in Polynomialzeit zu "lösen", da es faktorielle Zeit braucht, um auch nur die Ausgabe aufzuzählen... also, nein, es ist nicht möglich.
0 Stimmen
@FlipMcF: Nein, das ist es nicht wirklich: a) nur um die optimal Lösung, nicht gut genug Lösungen, die für reale Zwecke gut genug sind, und b) wir müssen nicht alle Knoten im Suchraum, d. h. alle Permutationen, erweitern; das ist es, was heuristische Algorithmen wie A*