Ich kenne itertools, aber es scheint, dass es nur Permutationen ohne Wiederholungen erzeugen kann.
Zum Beispiel möchte ich alle möglichen Würfelwürfe für 2 Würfel generieren. Ich brauche also alle Permutationen der Größe 2 von [1, 2, 3, 4, 5, 6] einschließlich Wiederholungen: (1, 1), (1, 2), (2, 1) ... usw.
Wenn möglich, möchte ich dies nicht von Grund auf neu implementieren
python
permutation
combinatorics
Bwmat
quelle
quelle
random.randint
wären einfacher und effizienter.Sie suchen keine Permutationen - Sie möchten das kartesische Produkt . Verwenden Sie dazu das Produkt von itertools:
from itertools import product for roll in product([1, 2, 3, 4, 5, 6], repeat = 2): print(roll)
quelle
In Python 2.7 und 3.1 gibt es eine
itertools.combinations_with_replacement
Funktion:>>> list(itertools.combinations_with_replacement([1, 2, 3, 4, 5, 6], 2)) [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 3), (3, 4), (3, 5), (3, 6), (4, 4), (4, 5), (4, 6), (5, 5), (5, 6), (6, 6)]
quelle
(2, 1)
,(3, 2)
,(3, 1)
und ähnlich ... In der Regel lässt sie alle Kombinationen, wo die zweite Rolle niedriger als die erste ist.In diesem Fall ist ein Listenverständnis nicht besonders erforderlich.
Gegeben
import itertools as it seq = range(1, 7) r = 2
Code
list(it.product(seq, repeat=r))
Einzelheiten
Es ist offensichtlich, dass kartesische Produkte Teilmengen von Permutationen erzeugen können. Daraus folgt jedoch:
product
Permutationen mit Ersatz, n r
[x for x in it.product(seq, repeat=r)]
Permutationen ohne Ersatz, n!
[x for x in it.product(seq, repeat=r) if len(set(x)) == r]
# Equivalent list(it.permutations(seq, r))
Folglich könnten alle kombinatorischen Funktionen implementiert werden aus
product
:combinations_with_replacement
implementiert vonproduct
combinations
implementiert vonpermutations
, die mit implementiert werden kannproduct
(siehe oben)quelle
Ich glaube, ich habe eine Lösung nur
lambdas
mitmap
und gefundenreduce
.product_function = lambda n: reduce(lambda x, y: x+y, map(lambda i: list(map(lambda j: (i, j), np.arange(n))), np.arange(n)), [])
Im Wesentlichen ordne ich eine erste Lambda-Funktion zu, die bei einer gegebenen Zeile die Spalten iteriert
list(map(lambda j: (i, j), np.arange(n)))
dann wird dies als Ausgabe einer neuen Lambda-Funktion verwendet
lambda i:list(map(lambda j: (i, j), np.arange(n)))
welches über alle möglichen Zeilen abgebildet wird
map(lambda i: list(map(lambda j: (i, j), np.arange(n))), np.arange(m))
und dann reduzieren wir alle resultierenden Listen zu einer.
noch besser
Kann auch zwei verschiedene Nummern verwenden.
prod= lambda n, m: reduce(lambda x, y: x+y, map(lambda i: list(map(lambda j: (i, j), np.arange(m))), np.arange(n)), [])
quelle
Zunächst möchten Sie den von itertools.permutations (Liste) zurückgegebenen Generator zuerst in eine Liste umwandeln. Zweitens können Sie set () verwenden, um Duplikate zu entfernen.
def permutate(a_list): import itertools return set(list(itertools.permutations(a_list)))
quelle