2016-06-07 6 views
2

ich ein einfaches Python-Programm geschrieben haben:Python itertools.combinations_with_replacement Rückkehr nicht alle Kombinationen

#!/usr/bin/env python3.5 
import sys, itertools 

sCharacters = '123' 
for iCombinationLength in range(0, len(sCharacters)+1): 
    for aCombination in itertools.combinations_with_replacement(sCharacters, iCombinationLength): 
    print(''.join(aCombination)) 

Das gibt das folgende:

1 
2 
3 
11 
12 
13 
22 
23 
33 
111 
112 
113 
122 
123 
133 
222 
223 
233 
333 

jedoch für sie alle Kombinationen der Zahlen zu 1 2 und 3, müsste es gehören:

311 
312 
313 
321 
322 
323 
331 
332 
333 

Und wie Sie oben sehen können, tut es nicht. Ich habe andere Beiträge gesehen, in denen die combinations_with_replacement-Funktion als Lösung angegeben wurde, um alle möglichen Kombinationen der übergebenen Zeichen zu erhalten. Dies scheint jedoch nicht zu geschehen. Was mache ich hier falsch, und wie bekomme ich alle möglichen Kombinationen der Zeichen in der Zeichenvariablen?

Vielen Dank für Ihre Zeit ;-)

Antwort

2

„Kombinationen“ ist ein Auftrag unempfindlichen Begriff; Wenn Sie 113 haben, dann brauchen Sie nicht 131 oder 311, weil alle von ihnen die gleiche "Kombination" sind (wenn die Eingabesequenz zu combinations_with_replacement ist einzigartig, können Sie die Ausgaben als alle eindeutigen Werte nach der Konvertierung zu collections.Counter; unabhängig von der Reihenfolge, zwei 1 s und eine 3 ist nur collections.Counter({1: 2, 3:1})).

Wenn Sie eine Bestellung sensible Version von combinations_with_replacement wollen (so 113, 131 und 311 sind alle separate Ausgänge), verwenden itertools.product mit dem repeat Argument (repeat muss nach Stichwort geben werden aufgrund Entwurf von product, wo es mit variabler Länge nimmt Positionsargumente):

sCharacters = '123' 
for iCombinationLength in range(0, len(sCharacters)+1): 
    for aCombination in itertools.product(sCharacters, repeat=iCombinationLength): 
    print(''.join(aCombination)) 
+0

Perfekt !! Danke für die Lösung, sehr geschätzt. – user2109254

+0

Wenn Sie mehr darüber wissen möchten, was 'itertools.product' tatsächlich macht, lesen Sie über [Kartesische Produkte] (https://en.wikipedia.org/wiki/Cartesian_product). – pzp