Python: все возможные комбинации «динамического» списка - PullRequest
5 голосов
/ 27 октября 2011

Я действительно не могу это выяснить. Я пытался использовать 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 голосов
/ 27 октября 2011

Вы можете использовать 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 голосов
/ 27 октября 2011

Попробуйте:

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 голос
/ 27 октября 2011

Вы можете реализовать это с помощью рекурсивной функции:

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 голосов
/ 27 октября 2011

Для реализации чего-то подобного сложность программы была бы очень высокой.попробуйте переработать логику, чтобы уменьшить сложность ..

...