我的任务是编写一个返回长度为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。有人可以给我一些提示吗?
答案 0 :(得分:0)
一些观察结果:
如果len
为1,则要返回[[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
。传递一个新的L
,其成员都是>= a
。或者,您可以简单地使用A
和B
作为参数并删除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']]