2017-06-09 4 views
0

Ich möchte Iterools Permutationen für Strings statt nur Buchstaben verwenden.Python Itertools Permutationen mit Strings

import itertools 
lst = list(permutations(("red","blue"),3)) 
#This returns [] 

Ich weiß, dass ich so etwas wie tun:

a = list(permutations(range(3),3)) 
for i in range(len(a)): 
a[i] = list(map(lambda x: 'red' if x==0 else 'blue' if x==1 else 'green',a[i])) 

EDIT: Ich möchte dies als meine Eingabe einzugeben, und erhalten diese als meine Ausgabe

input: ("red","red","blue") 

output: 
[(’red’, ’red’, ’red’), (’red’, ’red’, ’blue’),\ 
(’red’, ’blue’, ’red’), (’red’, ’blue’, ’blue’), (’blue’, ’red’, ’red’), \ 
(’blue’, ’red’, ’blue’), (’blue’, ’blue’, ’red’), (’blue’, ’blue’, ’blue’)] 
+1

was ist Ihre erwartete Ausgabe? Deine ursprüngliche Idee sieht für mich ok aus, der Grund, warum es '[]' zurückgibt, ist, dass du nach Länge-3-Permutationen in einer Liste von Länge-2 fragst - es gibt keine! – maxymoo

+2

Es funktioniert perfekt, um Saiten zu vertauschen. Sie können jedoch nicht drei Elemente aus einer Liste von zwei Elementen in beliebiger Reihenfolge auswählen. Deshalb erhalten Sie die leere Liste als Ausgabe. – JohanL

+2

sieht so aus, wie Sie wollen [Produkt] (https://docs.python.org/3/library/itertools.html#iitertools.product) – Copperfield

Antwort

2

können Sie versuchen Sie mit itertools.product wie folgt:

import itertools 
lst = list(set(itertools.product(("red","red","blue"),repeat=3))) # use set to drop duplicates 
lst 

lst wird:

[('red', 'blue', 'red'), 
('blue', 'red', 'red'), 
('blue', 'blue', 'red'), 
('blue', 'blue', 'blue'), 
('blue', 'red', 'blue'), 
('red', 'blue', 'blue'), 
('red', 'red', 'blue'), 
('red', 'red', 'red')] 

Update:

import itertools 
lst = list(itertools.product(("red","blue"),repeat=3)) 
lst 

Ausgang:

[('red', 'red', 'red'), 
('red', 'red', 'blue'), 
('red', 'blue', 'red'), 
('red', 'blue', 'blue'), 
('blue', 'red', 'red'), 
('blue', 'red', 'blue'), 
('blue', 'blue', 'red'), 
('blue', 'blue', 'blue')] 
+0

Wie bekomme ich die gleiche Ausgabe, wenn meine Eingabe nur ['rot', ' blau '] und ich möchte das gleiche Produkt? – Silver

+0

@Silber überprüfen Sie die aktualisierte Antwort. –

1

Sie können es tun, auch mit combinations von itertools Modul, wie in diesem Beispiel :

from itertools import combinations 
final = list(set(combinations(("red","red","blue")*3, 3))) 

print(final) 

Ausgang:

[('red', 'blue', 'red'), 
('blue', 'red', 'red'), 
('blue', 'blue', 'red'), 
('blue', 'blue', 'blue'), 
('blue', 'red', 'blue'), 
('red', 'blue', 'blue'), 
('red', 'red', 'blue'), 
('red', 'red', 'red')]