我有一个任意(但统一)数字列表的任意列表。 (它们是我想要绘制角的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:])
谢谢。
答案 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)
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])