2011-10-27 104 views
5

我真的找不到這個。我試圖使用itertools,嘗試所有類型的循環,但仍然無法實現我想要的。以下是我需要:Python:所有可能的「動態」列表組合

我有列表,如:

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] 

由於您的列表將只包含最多五個項目,這是一個合理的解決方案。