2010-09-03 11 views
51

अगर मैं दो तार, 'abc' और 'def' थी, मैं छोरों के लिए दो का उपयोग कर उन्हें के सभी संयोजनों मिल सकता है:लूप्स के लिए नेस्ट का उपयोग सूची समझ

for j in s1: 
    for k in s2: 
    print(j, k) 

हालांकि, मैं का उपयोग कर यह करने के लिए सक्षम होने के लिए चाहते हैं सूची समझ मैंने कई तरीकों की कोशिश की है, लेकिन इसे कभी हासिल नहीं किया है। क्या किसी को भी यह करना आता है?

उत्तर

86
lst = [j + k for j in s1 for k in s2] 

या

lst = [(j, k) for j in s1 for k in s2] 

आप tuples चाहते हैं।

प्रश्न में, for j... बाहरी लूप है, for k... आंतरिक पाश है।

अनिवार्य रूप से, आप एक के बाद एक को चिपके हुए एक सूची समझ में चाहते हैं, तो आप एक्स में वाई के लिए कई स्वतंत्र हो सकते हैं।

+0

+1 के बाद से ओपी नियंत्रण रेखा के लिए कहा। –

27

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

itertools.product('abc', 'def', 'ghi') 
+0

+1 क्योंकि इस –

+0

के लिए उत्पाद एलसी की तुलना में एक अच्छा जवाब है, itertools फिर से हमला करता है! अच्छा समाधान –

0

कोशिश भी प्रत्यावर्तन:

s="" 
s1="abc" 
s2="def" 
def combinations(s,l): 
    if l==0: 
     print s 
    else: 
     combinations(s+s1[len(s1)-l],l-1) 
     combinations(s+s2[len(s2)-l],l-1) 

combinations(s,len(s1)) 

आप 8 संयोजन देता है:

abc 
abf 
aec 
aef 
dbc 
dbf 
dec 
def 
+0

ओपी के सवाल को पूरा करने के लिए, मुझे लगता है कि आउटपुट को अक्षरों के जोड़ों को देना चाहिए, और 9 संयोजन होना चाहिए। – Mattia

+0

क्या हुआ: abd, abe, acd, ace, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe, और सी, ई, या एफ से शुरू होने वाले सभी लोग क्या हुआ? यहां तक ​​कि अगर आदेश महत्वपूर्ण नहीं है, तो छोड़ा गया है: बीडीए, एडी, इत्यादि –

+0

जिस तरह से यह काम करता है, कि बाएं सबसे अधिक स्थिति केवल "ए" या "डी" हो सकती है, मध्य स्थिति केवल "बी" या " ई ", और सही स्थिति केवल" सी "या" एफ "हो सकती है। –