[英]python recursion on list of lists without isinstance (different)
我有一個任意(但統一)的數字列表。 (它們是我要繪制其角的n空間中容器的邊界坐標,但這並不重要。)我想生成所有可能組合的列表。 因此:[[1,2],[3,4],[5,6]]產生[[1,3,5],[1,3,6],[1,4,5],[1, 4,6],[1,2,3,5] ...]。
誰能幫我改進此代碼? 我不喜歡isinstance()調用,但是當第一個arg(pos)是一個數字列表而不是一個列表時,我想不出一種更蟒蛇般的方式在第一遍添加元素列表。
def recurse(pos, vals):
out = []
for p in pos:
pl = p if isinstance(p,list) else [p]
for x in vals[0]:
out.append(pl + [x])
if vals[1:]:
return recurse(out, vals[1:])
else:
return out
a = [[1,2,3],[4,5,6],[7,8,9],[11,12,13]]
b = recurse(a[0], a[1:])
謝謝。
從您的示例看來,您想要的只是
from itertools import product
a = [[1,2,3],[4,5,6],[7,8,9],[11,12,13]]
print list(product(*a))
import itertools
a = [[1,2,3],[4,5,6],[7,8,9],[11,12,13]]
iterator = itertools.product(*a)
result = [item for item in iterator.next()]
為了變得更pythonic,您不想執行類型檢查。 Python完全是關於管道類型的。 如果將元組傳遞給函數會發生什么(應該更有效)。
你可以試試
if type(p) != list:
try:
p = list(p)
except TypeError:
p = [p]
pl = p
當有一個庫/模塊可以滿足您的要求時,您應該選擇使用它(對所有提到itertools.product的人都加+1)。 但是,如果您對實現此目標的算法感興趣,那么您正在尋找一類稱為遞歸下降的算法
answer = []
def recurse(points, curr=[]):
if not points:
answer.append(curr)
curr = []
return
else:
for coord in points[0]:
recurse(points[1:], curr+[coord])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.