2013-07-28 94 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'