如何使用 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
原来我是在寻找组合而不是笛卡尔积。
我需要做几个单词的笛卡尔积(所有单词都在一个列表中)。
我的输入看起来像这样:
[[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