没有isinstance的列表列表中的python递归(不同)

时间:2011-05-13 13:20:26

标签: python recursion

我有一个任意(但统一)数字列表的任意列表。 (它们是我想要绘制角的n空间中的区间的边界坐标,但这并不重要。)我想生成所有可能组合的列表。所以:[[1,2],[3,4],[5,6]]产生[[1,3,5],[1,3,6],[1,4,5],[1, 4,6],[2,3,5] ...]。

任何人都可以帮我改进这段代码吗?我不喜欢isinstance()调用,但是当第一个arg(pos)是一个数字列表而不是列表时,我无法想出更多python-ish方法在第一遍传递元素列表。

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:])

谢谢。

4 个答案:

答案 0 :(得分:6)

从你的例子看,你想要的只是

from itertools import product
a = [[1,2,3],[4,5,6],[7,8,9],[11,12,13]]
print list(product(*a))

答案 1 :(得分:1)

尝试使用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()]

答案 2 :(得分:0)

要更加pythonic你不想做类型检查。 Python就是风管打字。如果将元组传递给函数会发生什么(这应该更有效)。

你可以尝试

if type(p) != list:
    try:
        p = list(p)
    except TypeError:
        p = [p]
pl = p    

答案 3 :(得分:0)

如果有一个库/模块可以满足您的需求,您应该选择使用它(对所有提到过itertools.product的人都是+1)。但是,如果您对算法感兴趣,那么您正在寻找一类名为recursive descent的算法

answer = []
def recurse(points, curr=[]):
    if not points:
        answer.append(curr)
        curr = []
        return
    else:
        for coord in points[0]:
            recurse(points[1:], curr+[coord])