使用場景
列舉組合:
問題是這樣的.
有 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...