2015-12-25 71 views
0

我的任務是編寫一個函數,它返回長度爲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(我知道這是沒有意義的)。我的想法是:python中重複的組合

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的工作有人能給我一些提示嗎?

+0

你的意思是,如果你不能使用[with_replacement(https://開頭docs.python.org/2/library/itertools.html#itertools.combinations_with_replacement),對吧? – Brian

+0

你的意思是說「它不工作」? – Psytho

+0

我的意思是列表不斷的嵌套,正如有人已經指出的那樣。 – Acee

回答

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

+0

是的,你是對的,謝謝。我知道爲什麼我的代碼不工作,但無法找到一個好的解決方案。經過一些更正後,它的工作原理 – Acee

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']]