2013-07-28 117 views
-2

一個簡單的問題:遞歸列表在python

如何使一個遞歸列表在python這樣的:

這是輸入:A,B,C,d

所需的輸出:

   A | A>B | A>B>C | A>B>C>D 

我試過這段代碼:

line = "A, B , C , D" 
line = line.split(',') 

for i in range(len(line)): 
    for j in range(i,len(line)): 
      c=q+line[j] 
      q=c+'>' 
    c=c+'|' 

但我想出了這樣的名單:

'A > B > C > D > B > C > D > C > D|' 

有什麼建議?

在此先感謝

+0

可迭代,顧名思義,有一個__iter__方法結束了我們的迭代,那麼爲什麼要像幾年前和幾年前的編碼? 只是說... –

+0

@Apero提供不使用'範圍'的解決方案。 – ovgolovin

+0

只需看看下面的羅馬解決方案。 我主要是在談論第一個範圍,而不是第二個範圍。 –

回答

3

這裏的發電機,讓你的輸出需要。性能方面它的速度更快一倍以上參加,這是O(N),而不是OTØ爲什麼我的使用範圍(LEN(迭代器)),所以很多人(N^2)

>>> def getstr(s): 
...  a = [x for x in s] 
...  res = None 
...  for x in a: 
...   if not res: res = x 
...   else: res = " > ".join([res, x]) 
...   yield res 
>>> 
>>> print " | ".join(getstr("ABCD")) 
'A | A > B | A > B > C | A > B > C > D' 
+0

+1我喜歡這個解決方案,因爲它重用了以前創建的字符串。 – ovgolovin

+0

順便說一下,我第一次看到可能使用'ireduce'(傳統reduce的迭代器模擬)的代碼。 – ovgolovin

+1

字符串連接在技術上是字符串長度的「O(N)」,而不僅僅是它們的編號,因爲所有字符的內存都需要被複制。所以這個算法可能也是'O(N^2)'。進一步的改進:'a = [x for x in s]'是不必要的,可以使用'list(s)'或者直接迭代字符串(或者使用'split'調用從逗號分隔的字母列表字符串,就像詢問者一樣)。 – Blckknght

2

是這樣的嗎?

#! /usr/bin/python3 

a = [c for c in 'ABCD'] 
result = ' | '.join ('>'.join (a [:x + 1]) for x in range (len (a))) 
print (result) 
1
>>> s = 'A , B , C , D' 
>>> L = map(str.strip, s.split(',')) 
>>> L 
['A', 'B', 'C', 'D'] 
>>> ' | '.join('>'.join(L[:i]) for i in range(1,len(L)+1)) 
'A | A>B | A>B>C | A>B>C>D'