如何生成没有重复和对称的itertools产品



我知道有一个非常相似的问题:Itertools产品不重复

但我有一些不同的东西。例如:

a = ['add', 'sub']
b = [2,3, 'a', 'b']
c = [1,3, 'a', 'c']
list(it.product(a, b, c))  # result is:[('add', 2, 1),('add', 2, 3),('add', 2, 'a'), ('add', 2, 'c'),
#('add', 3, 1),('add', 3, 3),('add', 3, 'a'),('add', 3, 'c'),('add', 'a', 1),('add', 'a', 3),
#('add', 'a', 'a'),('add', 'a', 'c'), ('add', 'b', 1),('add', 'b', 3),('add', 'b', 'a'),
#('add', 'b', 'c'),('sub', 2, 1),('sub', 2, 3),('sub', 2, 'a'),('sub', 2, 'c'),('sub', 3, 1),
#('sub', 3, 3),('sub', 3, 'a'),('sub', 3, 'c'),('sub', 'a', 1),('sub', 'a', 3),('sub', 'a', 'a'),
#('sub', 'a', 'c'),('sub', 'b', 1),('sub', 'b', 3),('sub', 'b', 'a'),('sub', 'b', 'c')]

结果:

我不想要add(a,a),因为第一个值==第二个值。

我只想保留add(3,a)add(a,3)中的1个,因为它是对称的。

我的例子只包含两个列表,但我可以使用5个或更多的列表来生成产品。

我不能使用combinations,因为:

product(['add', 'sub', 1,2,3, 'a','b', 'c'], repeat=3)product(['add', 'sub'], [2,3, 'a', 'b'], [1,3, 'a', 'c'])不同

product(['add', 'sub', 1,2,3, 'a','b', 'c'], repeat=3)中的某些内容对我来说不太好。

我想要一个快速的方法,因为我的程序是时间敏感的。

IIUC,你可以做:

from itertools import product, combinations, chain
a = ['add', 'sub']
b = [2, 3, 'a', 'b']
c = [1, 3, 'a', 'c']
for operation, operands in product(a, combinations(set(chain(b, c)), r=2)):
print((operation, *operands))

输出

('add', 1, 2)
('add', 1, 3)
('add', 1, 'a')
('add', 1, 'b')
('add', 1, 'c')
('add', 2, 3)
('add', 2, 'a')
('add', 2, 'b')
('add', 2, 'c')
('add', 3, 'a')
('add', 3, 'b')
('add', 3, 'c')
('add', 'a', 'b')
('add', 'a', 'c')
('add', 'b', 'c')
('sub', 1, 2)
('sub', 1, 3)
('sub', 1, 'a')
('sub', 1, 'b')
('sub', 1, 'c')
('sub', 2, 3)
('sub', 2, 'a')
('sub', 2, 'b')
('sub', 2, 'c')
('sub', 3, 'a')
('sub', 3, 'b')
('sub', 3, 'c')
('sub', 'a', 'b')
('sub', 'a', 'c')
('sub', 'b', 'c')

最新更新