2011-05-13 6 views
2

임의의 (그러나 균일 한) 숫자 목록이 있습니다. (그것들은 모서리가 음모를 꾸미고 싶은 n-space에서 bin의 경계 좌표이지만 중요하지는 않습니다.) 모든 가능한 조합 목록을 생성하고 싶습니다. 그래서 [[1,2], [3,4], [5,6]]는 [[1,3,5], [1,3,6], [1,4,5], [1, 4,6], [2,3,5] ...].isinstance가없는 목록의 목록에있는 파이썬 재귀 (다른)

누구든지이 코드를 개선 할 수 있습니까? isinstance() 호출이 마음에 들지 않지만 첫 번째 인수에서 요소를 추가하는 더 많은 파이썬 방법을 알아낼 수는 없습니다. 첫 번째 인수 (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:]) 

감사합니다. 귀하의 예제에서

답변

6

은 당신이 원하는 모든

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

당신이 유형 검사를하고 싶지 않아 한 파이썬 더 될 것 같다. 파이썬은 덕트 타이핑에 관한 모든 것입니다. 함수에 튜플을 넘기는 경우 (더 효율적이어야 함) 어떻게 될까요? 당신이 원하는 않는 라이브러리/모듈이있는 경우

당신은

if type(p) != list: 
    try: 
     p = list(p) 
    except TypeError: 
     p = [p] 
pl = p  
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()] 
0

으로 시도하려고 할 수 있습니다, 당신은 모든 사람들에게 (+1를 사용 선택해야하는 사람들 언급 한 itertools.product). 그러나이를 수행하는 알고리즘에 관심이있는 경우 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]) 
이라는 알고리즘 클래스를 찾고 있습니다.
관련 문제