2017-06-09 1 views
0

Je veux utiliser Itertools permutations pour les chaînes au lieu de seulement des lettres.Python Itertools permutations avec des chaînes

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

Je sais que je peux faire quelque chose comme:

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: Je veux clé dans ce que mon entrée, et obtenir ce que ma sortie

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

quel est votre résultat attendu? votre idée originale me semble correcte, la raison pour laquelle elle renvoie '[]' est parce que vous demandez des permutations de longueur-3 dans une liste de longueur-2 - il n'y en a pas! – maxymoo

+2

Cela fonctionne parfaitement pour permuter les chaînes. Cependant, vous ne pouvez pas prendre trois éléments dans une liste de deux, dans n'importe quel ordre. C'est pourquoi vous obtenez la liste vide en sortie. – JohanL

+2

ressemble à ce que vous voulez [produit] (https://docs.python.org/3/library/itertools.html#itertools.product) – Copperfield

Répondre

2

Vous pouvez essayez avec itertools.product comme ceci:

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

lst sera:

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

Mise à jour:

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

sortie:

[('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

Comment puis-je obtenir la même sortie si mon entrée est juste ['rouge', ' bleu '] et je veux le même produit? – Silver

+0

@Silver vérifier la réponse mise à jour. –

1

Vous pouvez le faire, aussi, avec combinations du module itertools, comme cet exemple :

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

print(final) 

Sortie:

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