您如何递归获得列表中所有项目的组合

时间:2019-06-27 20:46:22

标签: python list recursion

在我的尝试中,我有一个列表:“ stuff”,应该递归进行迭代以查找所有可能的组合。它通过尝试对除第一个项以外的所有项进行递归,尝试对除[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 个答案:

答案 0 :(得分:2)

一种方法是通过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

我将留给您编辑此功能,以便仅返回给定大小的结果。

相关问题