如何在python中获得长度n的所有组合

如何在python中获得长度n的所有组合,python,combinations,Python,Combinations,我想知道是否有任何方法可以从数字列表中获得所有长度组合n 例如,如果我的列表是[1,2,3,4],并且我想要输出(如果我选择了n=3) 像[2,1,3]这样的其他排列对我没有用处。可以做到这一点 import itertools for comb in itertools.combinations([1, 2, 3, 4], 3): print comb 输出 (1, 2, 3) (1, 2, 4) (1, 3, 4) (2, 3, 4) 添加递归函数: def combinatio

我想知道是否有任何方法可以从数字列表中获得所有长度组合
n

例如,如果我的列表是
[1,2,3,4]
,并且我想要输出(如果我选择了n=3)

像[2,1,3]这样的其他排列对我没有用处。

可以做到这一点

import itertools
for comb in itertools.combinations([1, 2, 3, 4], 3):
    print comb
输出

(1, 2, 3)
(1, 2, 4)
(1, 3, 4)
(2, 3, 4)

添加递归函数:

def combinations(array, tuple_length, prev_array=[]):
    if len(prev_array) == tuple_length:
        return [prev_array]
    combs = []
    for i, val in enumerate(array):
        prev_array_extended = prev_array.copy()
        prev_array_extended.append(val)
        combs += combinations(array[i+1:], tuple_length, prev_array_extended)
    return combs

combinations([1, 2, 3, 4], 3)
产出:

[[1, 2, 3], 
[1, 2, 4], 
[1, 3, 4], 
[2, 3, 4]]

如果不想一次计算所有组合,可以制作一个生成器,返回长度n的组合,如下所示:

def组合(列表获取组合、长度组合):
“”“生成器以获取列表中某些长度元素的所有组合。
:param list_get_comb:要从中获取其元素组合的列表。
:param length_composition:list_get_comb元素组合的长度。
:return:Generator与此列表的组合。
"""
#生成器以获取列表的索引组合
def get_索引组合(子列表索引、最大索引):
“”“返回索引组合的生成器。”
:param sub_list_index:用于生成所有可能组合的子列表。
:param max_index:最大索引。
:返回:
"""
如果len(子列表索引)=1:#索引列表的最后一个索引
对于范围内的索引(子列表索引[0],最大索引+1):
收益率[指数]
elif all([sub_list_index[-i-1]==max_index-i表示i in
范围(len(sub_list_index))]:#当前子列表已到达末尾
收益子列表指数
其他:
对于组合中的梳状获取索引(子列表索引[1:],
max_index):#获取子列表子列表索引的所有可能组合[1:]
收益率[子列表索引[0]]+comb
#前进一个位置并检查所有可能的组合
新的子列表=[]
新建子列表。扩展([子列表索引[0]+i+1表示范围内的i(len(子列表索引)))
对于get_索引组合中的新_梳(新_子_列表,最大索引):
产生新的_comb#返回新列表的所有可能组合
#启动算法:
子列表索引=列表(范围(长度组合))
对于获取索引组合中的列表索引(子列表索引,len(列表获取梳)-1):
收益率[列表索引中i的列表获取梳[i]
致电:

comb=组合([1,2,3,4],3)
您可以通过调用
next(comb)
或在循环中使用生成器:
为comb中的c:
逐个计算长度3的可能组合

此代码的优点是,如果列表很长,有许多可能的组合,并且您希望获得满足某些条件的所有可能组合中的一个,那么您不需要计算所有可能的组合,然后根据该条件对其进行过滤。您可以一个接一个地生成它们,直到找到符合条件的组合。这将在计算上更加有效。同样,请注意,上面的代码只计算长度为n的那些组合,而不是计算所有可能的组合,然后按长度对它们进行过滤,这也使得它更有效


但是,如果需要,您可以一次计算所有组合,方法是列出它们
list(comb)

如果具有
[1,2,3]
意味着您不需要
[2,1,3]
,您描述的是组合,而不是排列。有点,但不确切。在我的情况下,如果我已经有[1,2,3],那么[1,3,2]、[2,1,3]、[2,3,1]、[3,1,2]和[3,2,1]对我来说是没有用的@对不起,我不知道有什么区别SI还没有找到这个问题的精确副本,OP需要所有特定长度的组合。有趣的是,我能找到的其他组合问题都要求找到一种生成全功率装置的方法。在找到这样一个问题之前(可能存在),我要说这不是一个重复。@J.F.Sebastian我强烈反对这是一个重复。这个问题对使用递归施加了额外的限制,这里的答案并没有出现在这个问题上。同样适用于python3。加上括号就行了
[[1, 2, 3], 
[1, 2, 4], 
[1, 3, 4], 
[2, 3, 4]]