Python:动态列表的所有可能组合

5

我很难找到这个答案。我尝试使用itertools,尝试各种循环,但仍然无法实现我想要的结果。这就是我需要的:

我有一个列表,例如:

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

我真的很迷茫。显然这可能是非常简单的事情,但我无法解决它。

4个回答

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')

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]

由于您的列表最多只包含五个项目,因此这是一个可行的解决方案。


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)]

-1

如果要实现这样的功能,程序的复杂度将非常高。尝试重新设计逻辑,以便降低复杂度。


好的,那么如果没有任何单词的情况呢?只是生成特定范围内所有数字的组合?这真的那么难吗?我只是在问,但我觉得应该不会那么难。 - Meph
@Anuj 请看一下其他答案。这其实非常简单,不复杂。 - agf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接