繁体   English   中英

与Python中的重复组合

[英]combinations with repetitions in 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> 2。有人可以给我一些提示吗?

一些观察:

  1. 如果len为1, len返回[[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 向其传递成员均为>= a的新L 或者,您可以简单地使用AB作为参数并摆脱L 然后,您可以在理解中使用range

我无法弄清楚递归,这是另一种选择

#!/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']]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM