2017-10-31 656 views
1

나는 목록의 번호를 가지고 :X의 조건부 데카르트 곱을 나열하면 k, v 쌍을 구할 수 있습니까? 다음과 같이

LISTA = ['A1', 'A2'] 
LISTB = ['B1', 'B2'] 
LISTC = ['C1'] 
LISTD = ['D1', 'D2'] 
LISTE = ['E1', 'E2', 'E3'] 

내가 '각 튜플에 LISTY의 값에 따라 다음 LISTXLISTY, 그리고 데카르트의 제품을 얻을 수있는 함수를 작성하고 싶습니다 d LISTJ의 제품 또는 LISTK의 제품을 추가하고 싶습니다. 모두 키/값 쌍으로 또는 목록으로 [0]이 키이고 [1]이 값입니다.

즉 만약 X == LISTA, Y == LISTB, J == LISTC, K == LISTE, 우리는 값 B1이 있다면 우리는 우리가 K(LISTE)와 제품을 얻을 J(LISTC)B2으로 제품을 얻을 가정, 우리는 같은 것을 받아야합니다 ...

[{'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}] 

아마 우리는이 제품을 처음으로 얻은 다음 제품 번호를 k,v 쌍 (또는 k)과 함께 해당 제품의 각 튜플에 대한 dict을 반환하기 위해 생성기를 사용할 수 있습니다. 그러나 인수에서 'y_val'을 갖는 것보다 더 일반적인 방법을 알아낼 수 없으며 (('LISTA', A1), ('LISTB', B1), C1)과 같은 튜플로 끝나는 것이 아니라 J_OR_K에 키를 할당하는 방법을 잘 모르겠습니다. 이것이 내가 이전에 asked을했습니다 질문에 대한 유사하지만

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) 

이 적당히 다르고 더 복잡 - 그래서 새 질문을 필요 느꼈다.

다음 중첩 된 이해가 예를 들어 원하는 효과에 작동
+0

하나의 문제는 내가 볼이되는리스트의 이름 'j_list'와'k_list' 매개 변수에서 (목록 자체 만 사용 가능하기 때문에) 결정할 수 없습니다. 가능한 해결책 : (1) 목록에서 파생 된 클래스로 이름을 보유하거나 (2) 목록 이름에 대한 추가 매개 변수. –

+0

'LISTD = [ 'D1', 'D2']'불필요한 것으로 보입니다. – jq170727

답변

1

는 솔루션의 대화 형 데모입니다 :

>>> 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'}] 
>>> 
2

: 여기

>>> 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')]