2015-10-11 1 views
1

Il s'est avéré que je cherchais des combinaisons et non le produit cartésien. Je dois faire un produit cartésien de plusieurs mots (tous dans une liste).Comment faire un produit cartésien pour les mots dans une liste en utilisant Python

Mon entrée ressemble à ceci:

[[id, [word1,word2,word3]],[id2,[word4,word5,word6]]] 

Le produit doit être fait sur les mots dans le premier index dans chaque liste des listes. Signification - sur word1, mots2, et word3 entre eux-mêmes, sur word4, mots5, et word6 entre eux-mêmes et ainsi de suite.

Mon code à ce jour:

for row in x: 
    row[1] = list(itertools.product(*row[1]) 

Le problème est que le script fait le produit sur chacune des lettres et non sur chacun des mots.

je reçois quelque chose comme: (w,w,w), (w,o,r), (w,o,d), etc.

Le résultat attendu est: (word1,word2), (word1,word3), (word2,word3). La même chose pour les autres parties ..

+0

Quel est le résultat attendu, btw? – WorldSEnder

+0

Modifié et ajouté la sortie attendue. – Shachar183

Répondre

2

itertools.product prend plusieurs itérations en entrée. Le produit cartésien est pris entre les itérations données. Par exemple. itertools.product([1, 2], [3, 4]) donne [(1, 3), (1, 4), (2, 3), (2, 4)].

Cela dit, ce que vous avez réellement voulu dire appeler a été itertools.combinations

for row in x: 
    row[1] = list(itertools.combinations(row[1], 2)) 
+0

il me donne aussi des combinaisons que je ne veux pas comme (mot1, mot1, mot1), (mot1, mot1, mot2). – Shachar183

+0

@ Shachar183, réparé. Je pensais déjà que vous le diriez mais je n'en étais pas sûr – WorldSEnder

1

Vous recherchez [list(itertools.product(row[1], repeat=len(row[1]))) for row in x]. Vous n'avez pas besoin d'utiliser l'opérateur * pour décompresser row[1], car itertools.product() prend des itérations entières comme arguments. Pour calculer le produit cartésien de chaque ligne "entre eux", utilisez le paramètre de répétition.

0
1 #!/usr/bin/python 
    2 # vim: noet sw=4 ts=4 
    3 
    4 d = [["id", ["word1","word2","word3"]],["id2"["word4","word5","word6"]]] 
    5 inner = d[0][1] 
    6 outer = d[1][1] 
    7 for o in outer: 
    8  for i in inner: 
    9   print '{0}x{1}'.format(i, o) 

word1xword4 
word2xword4 
word3xword4 
word1xword5 
word2xword5 
word3xword5 
word1xword6 
word2xword6 
word3xword6 
+0

Pouvez-vous améliorer le formatage et ajouter un peu d'explication à ce que vous faites? – WorldSEnder