2011-10-27 37 views
5

私は本当にこれを見つけることができません。 itertoolsを使用しようとしましたが、あらゆる種類のループを試しましたが、それでも私が望むものを達成することはできません。ここで私は必要なものである:Python: "dynamic"リストのすべての可能な組み合わせ

私がリストを持っているよう:

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

このリストには、毎回違う、そこたびに、その中に5種類のアイテムも、何私は必要なのこのような何かを得ることであることができます:

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つのアイテムしか含まれないため、これは妥当な解決策です。

関連する問題