[英]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。有人可以给我一些提示吗?
一些观察:
如果len
为1, len
返回[[A],[A + 1],...,[B]],而不要返回[A,A + 1,...,B]。 因此,您需要将值包装在自己的列表中,而不是仅返回L
,对吧?
在另一种情况下,当len
不为1时, [a,b]
将保留嵌套列表,例如[x,[x,[x...]]]
。 因此,请使用[a]+b
代替[a,b]
。 除非您如上所述解决基本情况,否则这将无法工作。
摆脱b>=a
测试。 这个不成立。 b
是一个列表,那么如何将其与a
进行比较,为什么还要呢?
相反,递归时不要传递L
向其传递成员均为>= a
的新L
或者,您可以简单地使用A
和B
作为参数并摆脱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.