2011-10-27 5 views
5

나는 이것을 정말로 발견 할 수 없다. itertools를 사용하려고했지만 모든 종류의 루핑을 시도했지만 여전히 원하는 것을 얻을 수 없습니다. 5 개 가지 그 항목마다하고 내가 필요한 것은이 같은 것을 얻을 수 있습니다있을 수 있습니다이 목록마다 다른파이썬 : "동적"목록의 모든 가능한 조합

list = [("car", 2), ("plane", 3), ("bike", 1)] 

:

내가 같은 목록을 가지고 : 여기가 필요하다 :

car1, plane1, bike1 
car1, plane2, bike1 
car1, plane3, bike1 
car2, plane1, bike1 
car2, plane2, bike1 
car2, plane3, bike1 

정말 실종입니다. 그것은 아마 아주 간단 할 것이 분명하지만, 나는 그것을 해결할 수 없습니다.

답변

7

당신은 itertools.product()을 사용할 수

my_list = [("car", 2), ("plane", 3), ("bike", 1)] 
a = itertools.product(*([name + str(i + 1) for i in range(length)] 
         for name, length in my_list)) 
for x in a: 
    print x 

인쇄

('car1', 'plane1', 'bike1') 
('car1', 'plane2', 'bike1') 
('car1', 'plane3', 'bike1') 
('car2', 'plane1', 'bike1') 
('car2', 'plane2', 'bike1') 
('car2', 'plane3', 'bike1') 
+0

@SvenMarnach : 고마워! 이것은 내가 찾고 있었던 바로 그 것이다! – Meph

-1

이와 같이 구현하기 위해 프로그램의 복잡성이 매우 높습니다. 당신이 복잡성을 줄일 수 있도록 논리를 재 작업 시도 ...

+0

좋아, 단어가없는 경우는 어떨까요? 특정 범위의 숫자 조합을 모두 생성합니까? 이게 정말 그렇게 어려운가요? 나는 단지 묻는다. 그러나 나는 그렇게 어렵지 않아야한다. – Meph

+0

@Anuj 다른 답변을 살펴보십시오. 이것은 사실 단순하지만 복잡하지 않습니다. – agf

1

당신은 재귀 기능을 구현할 수 :

def combis(ls): 
    if not ls: 
     yield [] 
     return 
    (name, limit) = ls[-1] 
    for start in combis(ls[:-1]): 
     for c in range(1, limit+1): 
     yield start + [(name, c)] 
+0

Pythonic 매우 좋지 않습니다. – agf

2

시험해보기 :

L = [("car", 2), ("plane", 3), ("bike", 1)] 
O = [] 
N = [] 
for each in L: 
    O.append(each[0]) 
    N.append(each[1]) 
for each in O: 
    strin = "" 
    for item in N: 
    strin = strin + item + each + "," 

    print strin[:-1] 

귀하의 목록에는 최대 5 개의 항목 만 포함되므로 가능한 해결책입니다.