列表的笛卡尔积没有重复

时间:2013-05-07 15:36:13

标签: python numpy

给定一个数组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..]

关注How to generate all permutations of a list in 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'''' c'是存储数字的变量1,2,3。因此,在获得字母组合列表后,我需要:说,

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

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

2 个答案:

答案 0 :(得分:5)

也许你真的想要combinations_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'不太难。

答案 1 :(得分:0)

如果原始集合保证唯一性,则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 .");']