2015-10-11 26 views
1

事实证明,我正在寻找组合而不是笛卡尔产品。如何使用Python为列表中的单词做笛卡尔积


我需要做几个单词的笛卡尔积(它们都在列表中)。

我输入看起来是这样的:

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

产品需要在列表中的每个列表中的第一个指数的话来进行。意义 - 关于他们自己之间的词1,词2和词3,以及彼此之间的词4,词5和词6等等。

我迄今为止代码:

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

的问题是,该脚本的产品。每个字母,而不是的话每一个。

我得到的是这样的:(w,w,w), (w,o,r), (w,o,d)

的预期结果是:(word1,word2), (word1,word3), (word2,word3)。对于其他部分也是如此。

+0

什么是预期的输出,顺便说一句? – WorldSEnder

+0

编辑并添加了预期输出。 – Shachar183

回答

2

itertools.product需要几次迭代作为输入。笛卡儿乘积是在给定的迭代之间进行的。例如。 itertools.product([1, 2], [3, 4])给出[(1, 3), (1, 4), (2, 3), (2, 4)]

说了这么多,你其实是要呼叫itertools.combinations

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

它给我也是我不想要的组合,如(word1,word1,word1),(word1,word1,word2)。 – Shachar183

+0

@ Shachar183,修复它。我已经认为你会这样说,但不确定 – WorldSEnder

1

您正在寻找[list(itertools.product(row[1], repeat=len(row[1]))) for row in x]。您不需要使用*运算符来解压缩row[1],因为itertools.product()将整个迭代作为参数。要计算“自己之间”每行的笛卡尔乘积,请使用重复参数。

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

你可以改进格式并添加一点解释你在做什么? – WorldSEnder