如何使用 Python 对列表中的单词进行笛卡尔积

How to do a Cartesian product for words in a list using Python

原来我是在寻找组合而不是笛卡尔积。


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

我的输入看起来像这样:

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

产品需要在每个列表列表中的第一个索引中的单词上制作。含义 - 在它们之间的 word1、words2 和 word3 上,在它们之间的 word4、words5 和 word6 上,依此类推。

到目前为止我的代码:

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)。其他部分也一样..

您正在寻找 [list(itertools.product(row[1], repeat=len(row[1]))) for row in x]。您不需要使用 * 运算符来解压 row[1],因为 itertools.product() 将整个可迭代对象作为参数。要计算每一行的笛卡尔积 "between themselves",请使用重复参数。

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))
  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