[英]Conditional Cartesian product of a X lists, resulting in dict with k,v pairs?
我有以下幾個列表:
LISTA = ['A1', 'A2']
LISTB = ['B1', 'B2']
LISTC = ['C1']
LISTD = ['D1', 'D2']
LISTE = ['E1', 'E2', 'E3']
我想編寫一個函數來獲得的笛卡爾乘積LISTX
和LISTY
,然后根據不同的價值LISTY
在每個元組,我想補充的兩種產品LISTJ
,或產品LISTK
。 所有為名為鍵/值對,或作為列表,其中[0]
是鍵, [1]
是值。
即如果X == LISTA
, Y == LISTB
, J == LISTC
, K == LISTE
,我們假設如果有值B1
我們得到帶有J(LISTC)
和B2
的產品我們得到帶有K(LISTE)
的產品K(LISTE)
那么我們應該得到像......
[{'LISTA': A1, 'LISTB': B1 'LISTC': C1},
{'LISTA': A1, 'LISTB': B2 'LISTE': E1},
{'LISTA': A1, 'LISTB': B2 'LISTE': E2},
{'LISTA': A1, 'LISTB': B2 'LISTE': E3},
{'LISTA': A2, 'LISTB': B1 'LISTC': C1},
{'LISTA': A2, 'LISTB': B2 'LISTE': E1},
{'LISTA': A2, 'LISTB': B2 'LISTE': E2},
{'LISTA': A2, 'LISTB': B2 'LISTE': E3}]
我認為這可能是我們首先獲得產品,然后使用生成器以返回該產品中每個元組的dict,以及從j
或k
分配的k,v
對。 但是,我無法弄清楚如何使這更通用,而不是在參數中使用'y_val',而且我也不確定如何在J_OR_K
分配鍵,而不是僅僅以(('LISTA', A1), ('LISTB', B1), C1)
的元組結束(('LISTA', A1), ('LISTB', B1), C1)
。
import itertools as it
def J_OR_K(P, y_val1, y_val2, j_list, k_list):
for k, v in P:
for x in {y_val1:j_list, y_val2:k_list}[v]:
yield {a,b,x}
def my_func(x, y, j, k):
res = []
# get cartesian product of x, y
prod_xy = it.product(it.product(['LISTA'], x),
it.product(['LISTB'], y))
# get product with EITHER J OR K
for t in J_OR_K(j, k):
res.append(t)
雖然這類似於我之前提出的一個問題,但這種情況有所不同,而且更為復雜 - 所以覺得它需要一個新問題。
以下嵌套理解適用於您的示例所需的效果:
>>> from itertools import product as p
>>> [x + y for x in p(LISTA, LISTB) for y in p(LISTC if x[1] == 'B1' else LISTE)]
[('A1', 'B1', 'C1'),
('A1', 'B2', 'E1'),
('A1', 'B2', 'E2'),
('A1', 'B2', 'E3'),
('A2', 'B1', 'C1'),
('A2', 'B2', 'E1'),
('A2', 'B2', 'E2'),
('A2', 'B2', 'E3')]
以下是解決方案的交互式演示:
>>> import itertools
>>> LISTA = ['A1', 'A2']
>>> LISTB = ['B1', 'B2']
>>> LISTC = ['C1']
>>> LISTD = ['D1', 'D2']
>>> LISTE = ['E1', 'E2', 'E3']
>>> def f():
... for a,b in itertools.product(LISTA,LISTB):
... n, l = {"B1":["LISTC",LISTC], "B2":["LISTE",LISTE]}[b]
... for x in l:
... yield {"LISTA":a, "LISTB":b, n:x}
...
>>> from pprint import pprint
>>> pprint(list(f()))
[{'LISTA': 'A1', 'LISTB': 'B1', 'LISTC': 'C1'},
{'LISTA': 'A1', 'LISTB': 'B2', 'LISTE': 'E1'},
{'LISTA': 'A1', 'LISTB': 'B2', 'LISTE': 'E2'},
{'LISTA': 'A1', 'LISTB': 'B2', 'LISTE': 'E3'},
{'LISTA': 'A2', 'LISTB': 'B1', 'LISTC': 'C1'},
{'LISTA': 'A2', 'LISTB': 'B2', 'LISTE': 'E1'},
{'LISTA': 'A2', 'LISTB': 'B2', 'LISTE': 'E2'},
{'LISTA': 'A2', 'LISTB': 'B2', 'LISTE': 'E3'}]
>>>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.