2017-02-21 5 views
5

ठीक श्रेणी के भीतर मानों के सभी एन-लम्बाई सरणी संयोजन उत्पन्न करना ठीक है। मैं इस समारोहपायथन:

def f(): 
    [[a,b,c] for a in range(6) for b in range(6) for c in range(6)] 

जो मूल्यों के लिए सभी संयोजनों क, ख उत्पन्न करनी चाहिए करने के लिए होशियार और अधिक कॉम्पैक्ट रास्ता तलाश रहा हूँ, यह पसंद C:

[0,0,0] 
[0,0,1] 
[0,0,2] 
... 
[1,0,0] 
[1,0,1] 
... 

और इतने पर। ..

लेकिन मुझे यह लचीला होना चाहिए, इसलिए मैं श्रेणी या पुनरावर्तनीय और जेनरेट किए गए सरणी की लंबाई भी बदल सकता हूं। रेंज एक आसान बात है:

def f(min, max): 
    [[a,b,c] for a in range(min,max) for b in range(min,max) for c in range(min,max)] 

यह 3 लंबाई सरणियों के लिए ठीक है, लेकिन मैं एक ही श्रेणी में उनके लिए 4-लंबाई सरणियों या 7-लंबाई सरणियों बनाने का अब सोच और सभी संयोजनों उत्पन्न कर रहा हूँ।

इसे किसी भी तरह से संयोजित करने वाले सरणी या घोंसले की समझ सूची के साथ एक आसान तरीका मौजूद होना चाहिए, लेकिन मेरे समाधान मधुमक्खी बहुत जटिल हैं।

इतनी लंबी पोस्ट के लिए खेद है।

+2

'itertools' मॉड्यूल एक' product' समारोह है कि वास्तव में क्या करता है आप देख रहे हैं 'itertools आयात उत्पाद से; उत्पाद (रेंज (6), रेंज (6), रेंज (6)) '। जो भी इटेटरेटर पिछले चक्रों को सबसे तेज़ रखा जाता है। – Elliot

उत्तर

3

आप itertools.product का उपयोग कर सकते हैं जो कि नेस्टेड पुनरावृत्तियों के लिए एक सुविधाजनक कार्य है। यह भी एक repeat -argument है अगर आप एक ही iterable कई बार दोहराना चाहते हैं:

>>> from itertools import product 

>>> amin = 0 
>>> amax = 2 
>>> list(product(range(amin, amax), repeat=3)) 
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)] 

list की list आप map इस्तेमाल कर सकते हैं पाने के लिए:

>>> list(map(list, product(range(amin, amax), repeat=3))) 
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]] 

हालांकि product पुनरावर्तक है, इसलिए यह है वास्तव में कुशल यदि आप इसे list पर कास्ट करने के बजाय इसे फिर से चालू करते हैं। कम से कम अगर यह आपके कार्यक्रम में संभव है। उदाहरण के लिए:

>>> for prod in product(range(amin, amax), repeat=3): 
...  print(prod) # one example 
(0, 0, 0) 
(0, 0, 1) 
(0, 1, 0) 
(0, 1, 1) 
(1, 0, 0) 
(1, 0, 1) 
(1, 1, 0) 
(1, 1, 1) 
+0

मैंने अंततः उत्पाद में elem के लिए '[सूची (elem) के साथ एक-लाइनर बनाया (* दोहराना (पुनरावृत्त, समय))]' – madtyn

1

itertools में आपको जो भी चाहिए वह सब कुछ है। combinations_with_replacement दिए गए लम्बाई के संयोजन को दोहराए गए तत्वों से दोहराने वाले तत्वों के साथ उत्पन्न करेगा। ध्यान दें कि लौटाया मूल्य इटेटरेटर होगा।

def f(min, max, num):  
    return itertools.combinations_with_replacement(range(min, max), num) 
+0

अन्य स्थितियों के लिए अच्छा है, लेकिन मुझे [0,0,1] चाहिए! = [1,0,0]। आदेश मायने रखता है। शायद मुझे बेहतर समझा जाना चाहिए था। मैं इसे लिखूंगा, हालांकि – madtyn

+0

ठीक है, फिर कुछ अन्य उत्तरों के अनुसार - itertools.product बेहतर होगा। – Pearley

6

आप itertools.product उपयोग कर सकते हैं:

from itertools import product 

def f(mn, mx, n): 
    return list(product(*[range(mn, mx)]*n))) 

ड्रॉप list, स्मृति दक्षता के लिए एक जनरेटर वापस जाने के लिए।

-1

जो आप खोज रहे हैं वह रेंजों का कार्टशियन उत्पाद है।सौभाग्य से यह पहले से ही itertools में मौजूद है

import itertools 
print(list(itertools.product(range(0,5), range(0,5), range(0,5)))) 
1

एक शुद्ध अजगर कार्यान्वयन:

k=2 # k-uples 
xmin=2 
xmax=5 
n=xmax-xmin 

l1 = [x for x in range(n**k)] 
l2 = [[ x//n**(k-j-1)%n for x in l1] for j in range(k)]   
l3 = [[ xmin + l2[i][j] for i in range(k)] for j in range(n**k)] 

l3 है:

[[2 2] 
[2 3] 
[2 4] 
[3 2] 
[3 3] 
[3 4] 
[4 2] 
[4 3] 
[4 4]] 
+0

आपको कोड की समीक्षा करनी चाहिए। * // एक वाक्यविन्यास त्रुटि देता है – madtyn

+0

यह '//' है। यह ठीक काम करता है – madtyn

+0

इसे इसे "शुद्ध अंतर्निर्मित" कार्यान्वयन के बजाय कॉल करना चाहिए। मुझे पाइथन की मानक लाइब्रेरी से कार्यक्षमता के साथ किए जाने की तुलना में अपठनीयता और संभावित रूप से अधिक स्मृति और समय ओवरहेड की वजह से यह गैर-पायथनिक लगता है। – Pearley