2015-11-08 10 views
5

उत्पन्न करने के लिए पाइथन itertools का उपयोग करके मुझे itertools का उपयोग करके पता है, हम products, permutations और combinations उत्पन्न कर सकते हैं।कस्टम पुनरावृत्ति

max_allowed_len(sequence)= 3 
iterable= ABC 
repeat= 3 (or just `range(len('ABC')`) 

मैं repetitions r होने से len(sequence)=0 len(sequence)=1 OR len(sequence)=2 and len(sequence)=3 साथ एबीसी के सभी विभिन्न iterable सेट पैदा करने में दिलचस्पी है: हालांकि, तरह के मामले पर विचार। पुनरावृत्ति के साथ एक अजीब क्रमपरिवर्तन की इसकी किस्म विभिन्न अनुक्रमों की अनुमति देता है। तो मेरी जगह है: 3^0 + 3^1 + 3^2 + 3^3= 1 + 3 + 9+ 27= 40 क्या कोई मुझे सुझाव दे सकता है कि इसे पाइथन या सी/सी ++ में कैसे कार्यान्वित किया जाए?

जैसे: अपेक्षित आउटपुट:

` '0' (कुछ भी नहीं (अनुक्रम लंबाई 0)) = 1

'A' 
'B' 
'C' 

लंबाई = 2

'AA' 
'BB' 
'CC' 
'AB' 
'AC',... 
साथ अनुक्रम लंबाई के साथ

अनुक्रम

लंबाई के साथ अनुक्रम = 3

'AAB' 
'ABA' 
'AAC' 
'ACA'` 

और यह आगे बढ़ता है। तो यहां मेरे पास 0, 1, 2 और 3 (अधिकतम) की लंबाई थी।

+0

क्या आप अपेक्षित आउटपुट का उदाहरण प्रदान कर सकते हैं? – thefourtheye

+0

निश्चित रूप से, प्रश्न को संशोधित करने के लिए केवल एक मिनट – Amir

+0

परिणाम में आपको '0' कैसे मिला? – thefourtheye

उत्तर

5

स्ट्रिंग इनपुट के लिए ऐसे इटरेटर बनाने के लिए यहां एक (अपेक्षाकृत) सरल तरीका है। यह शून्य अनुक्रम के लिए एक खाली स्ट्रिंग '' आउटपुट करता है। आउटपुट को पढ़ने में आसान बनाने के लिए मैं इसे दो बार बुलाता हूं।

फ़ंक्शन का मूल product का उपयोग कर जनरेटर एक्सप्रेशन लूप है repeat तर्क के साथ शून्य से लेकर इनपुट स्ट्रिंग की लंबाई तक लंबाई के उत्पादों के प्रत्येक समूह के लिए इटरेटर उत्पन्न करने के लिए। इन इटरेटर्स को chain.from_iterable द्वारा उपभोग किया जाता है और द्वारा उत्पादित प्रत्येक ट्यूपल पर विधि को कॉल करने के लिए imap का उपयोग करके ''.join विधि से खिलाया जाता है।

from itertools import product, chain, imap 

def all_prod(s): 
    return imap(''.join, chain.from_iterable(product(s, repeat=i) for i in range(len(s)+1))) 

print(list(all_prod('ABC'))) 

for s in all_prod('abc'): 
    print(s) 

उत्पादन

['', 'A', 'B', 'C', 'AA', 'AB', 'AC', 'BA', 'BB', 'BC', 'CA', 'CB', 'CC', 'AAA', 'AAB', 'AAC', 'ABA', 'ABB', 'ABC', 'ACA', 'ACB', 'ACC', 'BAA', 'BAB', 'BAC', 'BBA', 'BBB', 'BBC', 'BCA', 'BCB', 'BCC', 'CAA', 'CAB', 'CAC', 'CBA', 'CBB', 'CBC', 'CCA', 'CCB', 'CCC'] 

a 
b 
c 
aa 
ab 
ac 
ba 
bb 
bc 
ca 
cb 
cc 
aaa 
aab 
aac 
aba 
abb 
abc 
aca 
acb 
acc 
baa 
bab 
bac 
bba 
bbb 
bbc 
bca 
bcb 
bcc 
caa 
cab 
cac 
cba 
cbb 
cbc 
cca 
ccb 
ccc 

Fwiw, यहाँ सादे chain समारोह का उपयोग करता है एक वैकल्पिक संस्करण है, यह imap के बजाय अतिरिक्त लूप का उपयोग करता है, इसलिए यह कम कुशल हो सकता है, लेकिन मुझे लगता है कि यह समझना थोड़ा आसान हो सकता है।

def all_prod(s): 
    return (''.join(v) for u in chain(product(s, repeat=i) for i in range(len(s)+1)) for v in u) 
+0

अच्छा और साफ उत्पादन! तो मूल रूप से यह एक पुनरावर्ती उत्पाद पुनरावृत्ति पर अतिरिक्त पाश है? – Amir

+1

@ एमीर: यह रिकर्सिव नहीं है - 'उत्पाद' कॉल एक पुनरावृत्त लूप में हैं। मुझे लगता है कि 'itertools' _might_ अपने कुछ कार्यों के लिए आंतरिक रूप से रिकर्सन का उपयोग करता है, लेकिन मुझे संदेह है कि ऐसा नहीं होता है, क्योंकि पुनरावृत्त एल्गोरिदम आमतौर पर तेज़ और अधिक रैम कुशल होते हैं। –

+0

हां। ये सही है। awsome – Amir

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