Python alle Permutationen von Zahlen erhalten
-
20-09-2019 - |
Frage
Ich versuche, alle möglichen Permutationen von einer Liste von Zahlen angezeigt werden, zum Beispiel, wenn ich 334 habe ich mag zu bekommen:
3 3 4
3 4 3
4 3 3
Ich muß in der Lage sein, dies von Ziffern für jede Menge zu tun, bis zu etwa 12 Ziffern lang sein.
Ich bin sicher, dass seine wahrscheinlich ziemlich einfach so etwas wie itertools.combinations verwenden, aber ich kann nicht ganz die Syntax richtig machen.
TIA Sam
Lösung
>>> lst = [3, 3, 4]
>>> import itertools
>>> set(itertools.permutations(lst))
{(3, 4, 3), (3, 3, 4), (4, 3, 3)}
Andere Tipps
ohne itertools
def permute(LIST):
length=len(LIST)
if length <= 1:
yield LIST
else:
for n in range(0,length):
for end in permute( LIST[:n] + LIST[n+1:] ):
yield [ LIST[n] ] + end
for x in permute(["3","3","4"]):
print x
Ausgang
$ ./python.py
['3', '3', '4']
['3', '4', '3']
['3', '3', '4']
['3', '4', '3']
['4', '3', '3']
['4', '3', '3']
Sie wollen Permutationen, nicht Kombinationen. Siehe: Wie alle Permutationen von einer Liste in Python generieren
>>> from itertools import permutations
>>> [a for a in permutations([3,3,4])]
[(3, 3, 4), (3, 4, 3), (3, 3, 4), (3, 4, 3), (4, 3, 3), (4, 3, 3)]
Beachten Sie, dass es die beiden 3s ist Permutation (das ist die richtige Sache mathematisch zu tun), aber es ist nicht das gleiche wie Ihr Beispiel. Dies wird nur einen Unterschied machen, wenn es Zahlen in der Liste dupliziert werden.
würde ich Python itertools
verwenden, aber wenn Sie hatte diese selbst zu implementieren, hier der Code, gibt alle Permutationen einer bestimmten Größe für eine Werteliste.
Beispiel: values = [1,2,3]
, size = 2
=> [[3, 2], [2, 3], [2, 1], [3, 1], [1, 3], [1, 2]]
def permutate(values, size):
return map(lambda p: [values[i] for i in p], permutate_positions(len(values), size))
def permutate_positions(n, size):
if (n==1):
return [[n]]
unique = []
for p in map(lambda perm: perm[:size], [ p[:i-1] + [n-1] + p[i-1:] for p in permutate_positions(n-1, size) for i in range(1, n+1) ]):
if p not in unique:
unique.append(p)
return unique