簡體   English   中英

沒有isinstance的列表列表上的python遞歸(不同)

[英]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))

嘗試使用itertools.product

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM