2010-09-03 13 views
51

如果我有兩個字符串,'abc''def',我可以用兩個for循環讓他們的所有組合:嵌套的for循環使用列表綜合

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] 

,如果你想元組。

和問題一樣,for j...是外部循環,for k...是內部循環。

從本質上講,你可以擁有儘可能多的獨立的「for x in y」子句,只需通過一個接一個地粘貼就可以在列表中理解。

+0

+1由於OP要求LC的。 – 2010-09-03 10:21:09

27

由於這本質上是笛卡爾產品,所以您也可以使用itertools.product。我認爲它更清晰,特別是當你有更多的輸入迭代。

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

+1因爲產品比LC的更好的答案 – 2010-09-03 10:22:09

+0

itertools再次罷工!好的解決方案 – 2014-02-13 13:58:10

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

對於OP的問題,我認爲輸出結果應該給出幾個字母,並且應該有9個組合。 – Mattia 2015-07-30 08:42:04

+0

發生了什麼事:abd,abe,acd,ace,acf,adb,adc,ade,adf,aeb,aed,afb,afc,afd,afe和所有以c,e或f開頭的數字?即使訂單不重要,也省略:bda,ade等 – 2017-03-26 02:38:01

+0

這種方式的工作方式是,最左邊的位置只能是「a」或「d」,中間位置只能是「b」或「 e「,正確的位置只能是」c「或」f「。 – 2017-03-27 22:31:51