python 多層for迴圈轉遞迴 迭代

2021-10-09 16:11:14 字數 2735 閱讀 7499

使用場景

列舉組合:

問題是這樣的.

有 n 個列表,分別從每個列表中取出乙個元素,一共有多少種組合?

例如:

a = ['a1','a2']

b = ['b1','b2','b3']

組合結果為:

[

('a1','b1'),

('a1','b2'),

('a1','b3'),

('a2','b1'),

('a2','b2'),

('a2','b3')

]

待組合的列表只有兩個這種情況就是簡單的遍歷:

'''

'''a = ['a1','a2']

b = ['b1','b2','b3']

res =

for i in a:

for j in b:

print(res)

擴充套件為 n 個如果還用for迴圈巢狀,**就是這樣的

a = ['a1','a2']

b = ['b1','b2','b3']

res =

for i in a:

for j in b:

for k in c:

......

如果是n層的話,這樣的**是無法表達的.

我們可以先將第乙個和第二個組合,再拿組合出的結果和第三個組合,依次類推...

如下如所示:

用**表示如下:

迭代

def merge(i,j):

"""i = "a"

j = ("b","c")

return: ("a","b","c")

"""res =

for p in (i,j):

if isinstance(p,tuple):

res.extend(p)

else:

return tuple(res)

def combinen(*args):

target = args[0]

for li in args[1:]:

tmp =

for i in target:

for j in li:

target = tmp

return target

遞迴

def merge(i,j):

"""i = "a"

j = ("b","c")

return: ("a","b","c")

"""res =

for p in (i,j):

if isinstance(p,tuple):

res.extend(p)

else:

return tuple(res)

def combine2(a, b):

res =

for i in a:

for j in b:

return res

def combinenrecursion(*args):

if len(args) == 2:

return combine2(*args)

return combine2(args[0],combinenrecursion(*args[1:]))

通用的多層 for 迴圈轉迭代上面用到的迭代方法是針對具體問題分析得來的,那麼有沒有一種通用的轉換方案呢? 答案是肯定的.

def combinen(*li):

res =

# 相當於最內層迴圈執行的次數.

total_times = reduce(lambda x, y: x*y, [len(item) for item in li])

n = 0

while n < total_times:

tmp = n

tem_res =

for i in range(len(li)):

# 餘數就是參與計算的元素的下標,商用於計算下乙個列表參與元素的下標.

tmp, cur = divmod(tmp, len(li[i]))

n += 1

return res

res = combinen(["a1","a2"], ["b1", "b2"], ["c1", "c2"])

for i in res:

print(i)

輸出結果如下:

['a1', 'b1', 'c1']

['a2', 'b1', 'c1']

['a1', 'b2', 'c1']

['a2', 'b2', 'c1']

['a1', 'b1', 'c2']

['a2', 'b1', 'c2']

['a1', 'b2', 'c2']

['a2', 'b2', 'c2']

Python教程 跳出多層迴圈for while

for跳出多層迴圈 break flag false for i in range 10 print 爺爺層 i for j in range 10 print 爸爸層 j if j 3 break flag true break for k in range 10 print 孫子層 k if k...

python中如何退出多層迴圈

1 定義標記變數 利用變數值的變化退出迴圈 第一種巢狀形式 a 1,2,3 5,5,6 7,8,9 init i 0 init j 0 flag true for i in range 3 for j in range 3 print i,j if a i j 5 flag false init i...

退出多層迴圈

方法一 正常情況下不報錯,三層迴圈,會執行5的三次方 raise 丟擲異常物件 固定用法 try中丟擲乙個異常,try裡所有的 都不會被執行。class getoutofloop exception pass try for i in range 5 for j in range 5 for k i...