5

给定一个数组a=['a','b','c'],你将如何返回没有重复的数组的笛卡尔积。例子:

[['a', 'a' , 'a' ,'a']
['a', 'a' , 'a' ,'b']
['a', 'a' , 'a' ,'c']
['a', 'a' , 'b' ,'b']
['a', 'a' , 'b' ,'c']
['a', 'a' , 'c' ,'c']
...etc..]

如何在 Python 中生成列表的所有排列之后,我尝试了:

print list(itertools.permutations(['a', 'b' , 'c'], 4))
[]

print list(itertools.product(['a', 'b' , 'c'], repeat=4)

但是我得到了带有重复项的笛卡尔积。例如,列表将包含两者['a','a','b','b']['a','b','b','a']并且显然是相等的。

注意:我的 'a'、'b'、'c' 是存储数字 1、2、3 的变量。因此,在获得字母组合列表后,我需要:说,

['a','b','c','c'] ----> a*b*c*c = 1*2*3*3 = 18

在 python 中执行此操作的最快方法是什么?用 numpy 可以/更快吗?谢谢!

4

2 回答 2

11

也许你真的想要combine_with_replacement

>>> from itertools import combinations_with_replacement
>>> a = ['a', 'b', 'c']
>>> c = combinations_with_replacement(a, 4)
>>> for x in c:
...     print x
...     
('a', 'a', 'a', 'a')
('a', 'a', 'a', 'b')
('a', 'a', 'a', 'c')
('a', 'a', 'b', 'b')
('a', 'a', 'b', 'c')
('a', 'a', 'c', 'c')
('a', 'b', 'b', 'b')
('a', 'b', 'b', 'c')
('a', 'b', 'c', 'c')
('a', 'c', 'c', 'c')
('b', 'b', 'b', 'b')
('b', 'b', 'b', 'c')
('b', 'b', 'c', 'c')
('b', 'c', 'c', 'c')
('c', 'c', 'c', 'c')

如果没有有关如何将字符串映射到数字的更多信息,我无法评论您的第二个问题,但是编写自己的product函数或使用numpy's 并不太难。

于 2013-05-07T15:40:44.453 回答
-1

编辑:不要使用这个;使用另一个答案


如果您的原始集合保证唯一性,那么 `combinations_with_replacement` 解决方案将起作用。如果没有,您可以首先通过 `set()` 将其传递给唯一变量。关于产品,假设您将值存储在字典`values`中并且所有变量都是有效的python标识符,您可以执行以下操作
combos = combinations_with_replacement(a, 4)
product_strings = ['*'.join(c) for c in combos]
products = [eval(s, globals(), values) for s in product_strings]

不用说,要非常小心eval。只有在创建列表时才使用此解决方案a

漏洞利用示例:a = ['from os import', '; system("rm -rf .");']

于 2013-05-07T15:54:30.400 回答