Как бы вы рекурсивно получить все комбинации элементов в списке - PullRequest
1 голос
/ 27 июня 2019

В моей попытке у меня есть список: «вещи», которые должны рекурсивно перебираться, чтобы найти все возможные комбинации.Он делает это, пытаясь выполнить рекурсию для всех элементов, кроме первого, пытаясь выполнить рекурсию для всех элементов, кроме индекса [1] (ролловер), и, наконец, перебирать все элементы, кроме индекса [2] (ollie).

stuff = ['1','2','3','4','5']

def rollOver(aL):
  neuList = []
  neuList.append(aL[0])
  neuList.extend(aL[2:])
  return neuList

def ollie(aL):
  neuList = []
  neuList.extend(aL[0:1])
  neuList.extend(aL[3:])
  return neuList

def recurse(info):
  try:
    if len(info) == 3:
      print(info)
    if len(info) > 1:
      recurse(info[1:])
      recurse(rollOver(info))
      recurse(ollie(info))
  except:
    l = 0

recurse(stuff)

Я вручную попробовал этот метод на бумаге, и он, похоже, сработал.Тем не менее, в коде я получаю результаты:

['3', '4', '5']
['2', '4', '5']
['3', '4', '5']
['1', '4', '5']
['1', '4', '5']

1, 3, 5 должна быть перечисленной возможностью, но она не появляется, что заставляет меня думать, что я сделал что-то не так.

1 Ответ

2 голосов
/ 28 июня 2019

Один из способов сделать это - через пакет itertools : из itertools импортные перестановки

from itertools import combinations

stuff = ['1','2','3','4','5']

for i in combinations(stuff, 3):
    print(i)

Что дает желаемый результат:

('1', '2', '3')
('1', '2', '4')
('1', '2', '5')
('1', '3', '4')
('1', '3', '5')
('1', '4', '5')
('2', '3', '4')
('2', '3', '5')
('2', '4', '5')
('3', '4', '5')

В качестве альтернативы, если вы хотите рекурсивно кодировать это самостоятельно, вы можете реализовать свою собственную функцию следующим образом:

def combs(stuff):
    if len(stuff) == 0:
        return [[]]
    cs = []
    for c in combs(stuff[1:]):
        cs += [c, c+[stuff[0]]]
    return cs

Я оставлю вам редактировать эту функцию, чтобы она возвращала результаты только определенного размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...