2011-10-27 103 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] 

由于您的列表将只包含最多五个项目,这是一个合理的解决方案。