2010-01-30 22 views
5

मैं एक सूची एल = है [क, ख, ग] और मैं tuples की एक सूची उत्पन्न करना चाहते हैं:सूची गुणा

[(a,a), (a,b), (a,c), (b,a), (b,b), (b,c)...] 

मैं कर की कोशिश की एल * एल, लेकिन यह काम नहीं किया। क्या कोई मुझे बता सकता है कि इसे पायथन में कैसे प्राप्त किया जाए।

+0

इस तरह के "उत्पाद" को "कार्टेशियन उत्पाद" या "प्रत्यक्ष उत्पाद" भी कहा जाता है (मुझे यकीन नहीं है कि एक शब्द या दूसरा यहां अधिक उपयुक्त है लेकिन पाइथन दस्तावेज़ स्वयं "कार्टेशियन उत्पाद" का उपयोग करता है।) – MatrixFrog

उत्तर

13

itertools मॉड्यूल बात की इस तरह के लिए उपयोगी कार्यों के एक नंबर शामिल हैं। ऐसा लगता है कि आप product की तलाश में जा सकता है:

>>> import itertools 
>>> L = [1,2,3] 
>>> itertools.product(L,L) 
<itertools.product object at 0x83788> 
>>> list(_) 
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)] 
7

itertools मॉड्यूल पर एक नज़र डालें, जो product सदस्य प्रदान करता है।

L =[1,2,3] 

import itertools 
res = list(itertools.product(L,L)) 
print(res) 

देता है:

[(1,1),(1,2),(1,3),(2,1), .... and so on] 
22

आप इसे एक सूची समझ के साथ क्या कर सकते हैं:

[ (x,y) for x in L for y in L] 

संपादित

तुम भी itertools.product उपयोग कर सकते हैं के रूप में दूसरों है सुझाव दिया, लेकिन केवल अगर आप 2.6 का उपयोग कर रहे हैं। सूची समझ 2.0 से पाइथन के सभी संस्करणों का काम करेगी। यदि आप itertools.product भालू का उपयोग करते हैं तो यह एक सूची के बजाय जनरेटर देता है, इसलिए आपको इसे परिवर्तित करने की आवश्यकता हो सकती है (इसके आधार पर आप इसके साथ क्या करना चाहते हैं)।

+0

स्पष्टीकरण के लिए धन्यवाद। – Schitti

0

एक्स = [क, ख, ग] y = [] एक्स में आइटम के लिए : ITEM2 के लिए एक्स में: y.append ((आइटम, ITEM2))

शायद नहीं pythonic तरीका लेकिन काम करने

0

ठीक है, मैं करने की कोशिश की:

एल 2 = [(एक्स, वाई) x के लिए एल में एल में एक्स के लिए] और इस एल वर्ग मिला है।

क्या यह करने के लिए यह सबसे अच्छा पायथनिक तरीका है? मैं एल * एल पायथन में काम करने की उम्मीद करेंगे।

+0

गलत उम्मीदें - 'अनुक्रम * अनुक्रम' ** ** परिभाषित नहीं है (केवल 'अनुक्रम * int', जो कुछ ** बहुत ** अलग करता है!)। –

+0

ओह, मैंने जवाब देखने से पहले इसे लिखा था। कृपया – Schitti

3

दो मुख्य विकल्प:

>>> L = ['a', 'b', 'c'] 
>>> import itertools 
>>> list(itertools.product(L, L)) 
[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('c', 'c')] 
>>> [(one, two) for one in L for two in L] 
[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('c', 'c')] 
>>> 

पूर्व एक की जरूरत है अजगर 2.6 या बेहतर - बस के बारे में कोई अजगर संस्करण में बाद के काम करता है आप से बंधा जा सकता है।

+0

को अनदेखा करें Iertools का उपयोग करना मेरे लिए अजीब लगता है अगर आप सीधे किसी सूची में कनवर्ट करने जा रहे हैं।सूची समझ शायद अधिक कुशल है, जैसा कि पठनीय और संभवतः अधिक रखरखाव योग्य है कि आप अभिव्यक्तियों के लिए सीधे बदलाव कर सकते हैं। अधिक अमूर्तता का अर्थ अधिक लचीलापन हो सकता है, और पूरा बिंदु उन विवरणों को छिपाना है जो आप * आशा करते हैं * (लेकिन सुनिश्चित नहीं हो सकते हैं) आपको फिर से चिंता करने की आवश्यकता नहीं होगी। – Steve314

0

करने के लिए सबसे पुराने जमाने जिस तरह से यह होगा:

def perm(L): 
    result = [] 
    for i in L: 
     for j in L: 
      result.append((i,j)) 
    return result 

यह हे की एक क्रम है (एन^2) और इसलिए काफी धीमी है, लेकिन आप इसे "विंटेज" शैली होने के लिए विचार कर सकते हैं कोड।

+0

इस के सभी दृष्टिकोणों में ओ (एन^2) रनटाइम सबसे अच्छा है, कारण है कि उन्हें सभी को ओ (एन^2) टुपल्स उत्पन्न करना है। इटरेटर जैसे इटरेटर का उपयोग करके आप उस काम में से कुछ को स्थगित कर सकते हैं, लेकिन आप इसे पूरी तरह से टालना नहीं कर सकते हैं। आपका दृष्टिकोण ओ (एन^3) भी हो सकता है - सूचियों में शामिल होने से ओ (एन) की बजाय ओ (एन) मेमोरी रीयलोकेशन मुद्दों की वजह से हो सकता है, हालांकि मुझे निश्चित रूप से याद नहीं है। मुझे लगता है * पाइथन सूची एक आकार बदलने योग्य सरणी - * नहीं * एक लिंक्ड सूची का उपयोग करती है। हालांकि, कुछ प्रकार के अनुकूलन अनुकूलन हो सकता है। एक सूची समझ * शायद * शुरुआत में पूरे सरणी preallocates। – Steve314

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