在python中重复的组合

时间:2015-12-25 15:41:13

标签: python

我的任务是编写一个返回长度为n的所有序列的函数,包括从A到B的数字,其中{A1 <= A2 <= A3 <= ... <= An}。例如,如果A = 1 B = 3 n = 2,它应该返回[[1,1],[1,2],[1,3],[2,2],[2,3],[3, 3]]。我必须使用递归和列表理解,并且不能使用itertools(我知道它没有意义)。我的想法是:

def combinations(L,len): #L is list [A,A+1, ... ,B]  
    if len == 1:
        return L
    return [[a,b] for a in L for b in combinations(L,len-1) if b>=a]

但它对n&gt;不起作用.2。有人可以给我一些提示吗?

2 个答案:

答案 0 :(得分:0)

一些观察结果:

  1. 如果len为1,则要返回[[A],[A + 1],...,[B]],而不是[A,A + 1,.. 。,B]就像你一样。所以你需要将值包装在自己的列表中,而不是只返回L,对吗?

  2. 在另一种情况下,当len不是1时,[a,b]将保留嵌套列表,例如[x,[x,[x...]]]。因此,请使用[a,b]而不是[a]+b。在您修复基本情况之前,这将无法工作,如上所述。

  3. 摆脱b>=a测试。这没有道理。 b是一个列表,那么如何将其与a进行比较,为什么您还想要?

  4. 相反,在递归时,请不要传递L。传递一个新的L,其成员都是>= a。或者,您可以简单地使用AB作为参数并删除L。然后你可以在你的理解中使用range

答案 1 :(得分:0)

我无法弄清楚递归,这里是另类

#!/usr/bin/python
def combinations(L,length): #L is list [A,A+1, ... ,B]
    length_L = len(L)
    L_new=[]
    for start in range(0,length_L):
        if length > 1:
            unit_self = retrieve_unit_self(L, start,length)
            L_new.append(unit_self)
        if start + length <= length_L:
            unit = retrieve_unit(L, start,length)
            L_new.append(unit)
    return L_new;
def retrieve_unit_self(L,start,length):
    unit=[]
    for index in range(0,length):
        unit.append(L[start])
    return unit
def retrieve_unit(L,start,length):
    unit=[]
    for index in range(0,length):
        unit.append(L[index+start])
    return unit
def main():
    L = ['a','b','c']
    L_new = combinations(L,1)
    print L_new
    L_new = combinations(L,2)
    print L_new
    L_new = combinations(L,3)
    print L_new
    L_new = combinations(L,4)
    print L_new
if __name__ == '__main__':
    main()

结果:

./list.py
[['a'], ['b'], ['c']]
[['a', 'a'], ['a', 'b'], ['b', 'b'], ['b', 'c'], ['c', 'c']]
[['a', 'a', 'a'], ['a', 'b', 'c'], ['b', 'b', 'b'], ['c', 'c', 'c']]
[['a', 'a', 'a', 'a'], ['b', 'b', 'b', 'b'], ['c', 'c', 'c', 'c']]