2012-10-09 16 views
11

में तार की सूची की सूची से शामिल हो गए स्ट्रिंग जाओ मैं सूचियों की एक सूची है और इस तरह एक विभाजक स्ट्रिंग है उप सूचियों में तार:अजगर

result = [ 
    'a-1-i', 
    'a-1-ii', 
    'a-2-i', 
    'a-2-ii', 
    'b-1-i', 
    'b-1-ii', 
    'b-2-i', 
    'b-2-ii', 
] 

परिणामस्वरूप आदेश अप्रासंगिक है।

मैं यह कैसे कर सकता हूं?

+0

फिलहाल मुझे यकीन है कि कैसे एक अच्छा pythonic तरीके से इस काम के पाने के लिए नहीं कर रहा हूँ और यह होमवर्क नहीं है,) – Martin

उत्तर

16
from itertools import product 
result = [separator.join(map(str,x)) for x in product(*lists)] 

itertools.product पुनरावर्तक कि प्रदान की iterables की कार्तीय उत्पाद का उत्पादन देता है। परिणामी tuples पर हमें mapstr की आवश्यकता है, क्योंकि कुछ मान इंक हैं। अंत में, हम स्ट्रिंगिफाइड टुपल्स में शामिल हो सकते हैं और पूरी चीज को सूची समझ में डाल सकते हैं (या बड़े डेटासेट से निपटने पर जनरेटर अभिव्यक्ति, और आपको इसे पुनरावृत्ति के लिए जरूरी है)।

+1

+1 महान जवाब आदमी - मैं इसे प्रिंट करना चाहता हूं और इसे अपने फ्रिज पर रखना चाहता हूं। – RocketDonkey

3
>>> from itertools import product 
>>> result = list(product(*lists)) 
>>> result = [separator.join(map(str, r)) for r in result] 
>>> result 
['a-1-i', 'a-1-ii', 'a-2-i', 'a-2-ii', 'b-1-i', 'b-1-ii', 'b-2-i', 'b-2-ii'] 

रूप @jpm ने कहा, क्या तुम सच में product जनरेटर से list कास्ट करने के लिए जरूरत नहीं है। मेरे पास इन्हें मेरे कंसोल में परिणाम देखने के लिए था, लेकिन उन्हें वास्तव में यहां जरूरी नहीं है।

+0

आपको उत्पाद को 'सूची' कन्स्ट्रक्टर में मजबूर करने की आवश्यकता नहीं है। 'मैप' एक इटरेटर पर बस ठीक काम करता है। इसके अलावा, आपको उस इटरेटर में सूचियों में tuples को मजबूर करने की आवश्यकता नहीं है। 'मानचित्र' और 'जॉइन' काम टुपल्स पर ठीक है। – jpm

+0

@jpm हाँ मैं अभी भी इसे संपादित कर रहा था। शुरुआत में मेरे पास परिणामों को देखने के लिए मेरे कंसोल में कोशिश करते समय इन्हें था, उन्हें बाद में हटा दिया जाना चाहिए :) –

+1

एक मध्यवर्ती सूची में इटरेटर को मजबूर करने पर एक और बिंदु: यदि कार्टेजियन उत्पाद बड़ा हो जाता है (एक पूरी तरह से संभावित परिदृश्य, इस उदाहरण के बावजूद), हम शायद इसे यथासंभव लंबे समय तक स्मृति में डालने में देरी करना चाहते हैं। आवेदन के आधार पर, हम सूची समझ के बजाय जनरेटर अभिव्यक्ति का भी उपयोग करना चाह सकते हैं। – jpm

1
["%s%c%s%c%s" % (a, separator, b, separator, c) for a in lists[0] for b in lists[1] for c in lists[2]] 
3

आप builtins के साथ ऐसा कर सकते हैं:

>>> map(separator.join, reduce(lambda c,n: [a+[str(b)] for b in n for a in c], lists, [[]])) 
['a-1-i', 'b-1-i', 'a-2-i', 'b-2-i', 'a-1-ii', 'b-1-ii', 'a-2-ii', 'b-2-ii'] 
+0

कार्यात्मक तकनीकों का अच्छा उपयोग। यदि आप आसपास के समझ के 'खंड' को स्विच करते हैं, तो आप ओपी द्वारा अनुरोधित आउटपुट से भी मिलान कर सकते हैं। – jpm

+0

ब्याज के बिंदु के रूप में, यह समाधान मेरे से बहुत धीमा है (2,000,000 से अधिक प्रतिनिधि नहीं, समय सारिणी के माध्यम से)। लगभग किसी भी आवेदन में चिंता करने के लिए शायद ही पर्याप्त है, लेकिन मुझे यह दिलचस्प लगता है। – jpm

+0

धन्यवाद। मैंने शर्तों के आदेश के बारे में बहुत मुश्किल नहीं सोचा, लेकिन ओपी ने कहा कि उन्हें आदेश की परवाह नहीं है। – Benedict