簡體   English   中英

X列表的條件笛卡爾積,導致k,v對的dict?

[英]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']

我想編寫一個函數來獲得的笛卡爾乘積LISTXLISTY ,然后根據不同的價值LISTY在每個元組,我想補充的兩種產品LISTJ ,或產品LISTK 所有為名為鍵/值對,或作為列表,其中[0]是鍵, [1]是值。

即如果X == LISTAY == LISTBJ == LISTCK == 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,以及從jk分配的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM