2017-03-06 3 views
7

मैं दो सूचियों है:युग्म

a = ['a', 'b'] 
b = [1, 2, 3] 

मैं के रूप में सूची b के तत्वों और सूची एक के तत्वों लेकिन a का इलाज तत्वों के बीच का उत्पादन संयोजन प्राप्त करना चाहते हैं जोड़े (या ट्रिपल इत्यादि) नीचे दिए गए उदाहरण के रूप में:

यह वास्तव में len(b) ** len(a) संयोजनों की संख्या देता है।

c = ["a_1 b_1", "a_1 b_2", "a_1 b_3", "a_2 b_1", "a_2 b_2", "a_2 b_3", "a_3 b_1", "a_3 b_2" "a_3 b_3"] 

मैं उपयोग करने के लिए कोशिश की है itertools.product (वर्णित के रूप में here) लेकिन यह केवल 6 संभव संयोजनों दे देंगे।

उत्तर

14

आप itertools.product(..) का उपयोग कर सकते हैं लेकिन repeatrepeat=len(a) के लिए निर्दिष्ट कर सकते हैं। तो आप का उपयोग कर सकते हैं:

>>> list(product(b,repeat=len(a))) 
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)] 

तो यहाँ टपल के पहले तत्व एक है कि a_ से जुड़ा हुआ है, b_ से पीछे से एक है:

from itertools import product 

def mul_product(a,b): 
    for tup in product(b,repeat=len(a)): 
     yield ' '.join('%s_%s'%t for t in zip(a,tup)) 

product(..) तरह tuples उत्पन्न होगा। अब हम उन्हें एक साथ zip(..)a सूची के साथ, उत्पादन:

>>> list(map(lambda bi:list(zip(a,bi)),product(b,repeat=len(a)))) 
[[('a', 1), ('b', 1)], [('a', 1), ('b', 2)], [('a', 1), ('b', 3)], [('a', 2), ('b', 1)], [('a', 2), ('b', 2)], [('a', 2), ('b', 3)], [('a', 3), ('b', 1)], [('a', 3), ('b', 2)], [('a', 3), ('b', 3)]] 

अब यह केवल स्वरूपण की बात ('%s_%s'%t), और ' '.join(..) उन्हें ining एक साथ और उन्हें yield है (या आप सूची समझ का उपयोग एक सूची तैयार कर सकते हैं)।

अपने नमूना इनपुट के लिए परिणाम है:

>>> list(mul_product(a,b)) 
['a_1 b_1', 'a_1 b_2', 'a_1 b_3', 'a_2 b_1', 'a_2 b_2', 'a_2 b_3', 'a_3 b_1', 'a_3 b_2', 'a_3 b_3'] 

ध्यान दें कि यहां तत्वों lazily उत्पन्न कर रहे हैं। यह उपयोगी हो सकता है यदि आप उदाहरण के लिए केवल पहले k वाले लोगों में रुचि रखते हैं, या जब आप उन्हें एक साथ में उत्पन्न नहीं करना चाहते हैं।

4

आप स्पष्ट रूप से itertools.product का उपयोग कर अपने जोड़ो में आइटम बना सकता है, तो itertools.product

import itertools 
a = ['a', 'b'] 
b = [1, 2, 3] 
pairs = [list(itertools.product([ai], b)) for ai in a] 

pairs के साथ फिर से उन जोड़े पर काम दो सूचियों कि itertools.product में फिर से तंग आ कर सकते हैं शामिल होंगे।

list(itertools.product(*pairs)) 

परिणाम है:

[(('a', 1), ('b', 1)), 
(('a', 1), ('b', 2)), 
(('a', 1), ('b', 3)), 
(('a', 2), ('b', 1)), 
(('a', 2), ('b', 2)), 
(('a', 2), ('b', 3)), 
(('a', 3), ('b', 1)), 
(('a', 3), ('b', 2)), 
(('a', 3), ('b', 3))] 
संबंधित मुद्दे

 संबंधित मुद्दे