itertools中列表的条件笛卡尔积 [英] Conditional Cartesian product of lists in itertools
问题描述
我有四个列表:
LISTA = ['A1', 'A2']
LISTB = ['B1_C', 'B2_D']
LISTC = ['C1', 'C2']
LISTD = ['D1', 'D2']
我想获得LISTA
和LISTB
的笛卡尔积,然后根据B的值,我想添加C的乘积或D的乘积.
I'd like to get the Cartesian product of LISTA
and LISTB
, and then depending on the value of B, I'd like to add either the product of C, or the product of D.
(A1 B1_C C1)
(A1 B1_C C2)
(A2 B1_C C1)
(A2 B1_C C2)
(A1 B2_D D1)
(A1 B2_D D2)
(A2 B2_D D1)
(A2 B2_D D2)
我可以使用itertools.product(LISTA, LISTB)
来获得第一部分,但是我一直在浏览 itertools
了解如何实现第二部分,我不确定最好的方法.有建议吗?
I can get the first part with itertools.product(LISTA, LISTB)
, but I've been looking through itertools
for how to achieve the second part and I'm not sure the best way to go. Suggestions?
推荐答案
此处是使用生成器的解决方案的交互式演示.
Here is an interactive demonstration of a solution using a generator.
>>> import itertools
>>> LISTA = ['A1', 'A2']
>>> LISTB = ['B1_C', 'B2_D']
>>> LISTC = ['C1', 'C2']
>>> LISTD = ['D1', 'D2']
>>> def C_OR_D(P):
... for a,b in P:
... for x in {"C":LISTC, "D":LISTD}[b[-1]]:
... yield a,b,x
...
>>> for t in C_OR_D(itertools.product(LISTA,LISTB)):
... print t
...
('A1', 'B1_C', 'C1')
('A1', 'B1_C', 'C2')
('A1', 'B2_D', 'D1')
('A1', 'B2_D', 'D2')
('A2', 'B1_C', 'C1')
('A2', 'B1_C', 'C2')
('A2', 'B2_D', 'D1')
('A2', 'B2_D', 'D2')
请注意,顺序与 Michael 请求的顺序不同,因为product(LISTA,LISTB)
中的第二个组件更改速度比第一个组件快.
Note that the order is different then what Michael requested because the second component in product(LISTA,LISTB)
changes faster then the first.
要获得指定的确切顺序,我们需要来自product(LISTB,LISTA)
的相反结果.例如
To get the exact ordering specified we need the reversed results from product(LISTB,LISTA)
. E.g.
>>> for t in C_OR_D((a,b) for (b,a) in itertools.product(LISTB,LISTA)):
... print t
...
('A1', 'B1_C', 'C1')
('A1', 'B1_C', 'C2')
('A2', 'B1_C', 'C1')
('A2', 'B1_C', 'C2')
('A1', 'B2_D', 'D1')
('A1', 'B2_D', 'D2')
('A2', 'B2_D', 'D1')
('A2', 'B2_D', 'D2')
还请注意,此方法允许LISTC
和LISTD
具有不相等的长度.例如
Note also that this approach allows LISTC
and LISTD
to have unequal length. E.g.
>>> LISTD = ['D1', 'D2', 'D3']
>>> for t in C_OR_D((a,b) for (b,a) in itertools.product(LISTB,LISTA)):
... print t
...
('A1', 'B1_C', 'C1')
('A1', 'B1_C', 'C2')
('A2', 'B1_C', 'C1')
('A2', 'B1_C', 'C2')
('A1', 'B2_D', 'D1')
('A1', 'B2_D', 'D2')
('A1', 'B2_D', 'D3')
('A2', 'B2_D', 'D1')
('A2', 'B2_D', 'D2')
('A2', 'B2_D', 'D3')
这篇关于itertools中列表的条件笛卡尔积的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!