2015-05-03 47 views
1

我对计算机科学相对较新,我正在学习如何在python中编写代码。我试图弄清楚如何创建一个函数,该函数接受一个列表并从输入列表返回一个后缀列表,按照从最短长度到最长长度的顺序。例如,输入 [3,4,2,-9,7,6,1] 的函数将返回 [[],[1],[6,1],[7,6,1],[-9,7,6,1],[2,-9,7,6,1],[4,2,-9,7,6,1],[3,4,2,-9,7,6,1]]蟒蛇后缀数组的变化

我试过多种方法,但到目前为止,我没有多少运气。以下是我迄今为止:

def h(m): 
    newlist = [] 
    x = 0 
    y = (len[m])-1 
    while x in range(y): 
     sublist = [] 
     sublist = sublist + m[x:y] 
     newlist.append(sublist) 
     x += 1 
    return new list 

当我尝试通过输入类似

a = [3,4,2,-9,7,6,1] 
h(a) 

运行功能,我得到一个错误:

Traceback (most recent call last): 
File "<pyshell#239>", line 1, in <module> 
h(a) 
File "<pyshell#238>", line 4, in h 
y = (len[m])-1 
TypeError: 'builtin_function_or_method' object has no attribute '__getitem__' 

我的目标与此位的代码仅仅是创建一个后缀列表,而不需要按照长度对它们进行排序。在弄清楚如何创建这个新列表之后,我将添加代码的排序位。请记住,这不是一项家庭作业。任何帮助将不胜感激!

回答

3
使用列表理解

可能的解决方案:

[l[i:] for i in range(len(l), -1, -1)] 

该代码使用切片和列表理解简单地返回片名单从结束。使用你的代码,需要很小的修改 - len是一个函数而不是字典,因此你需要使用call operator()而不是subscript operator []。

y = len(m) - 1 

虽然不会产生正确的结果,因为您不会得到最后一个后缀和空后缀。为了掩盖这两个,你将需要修改y或循环覆盖它们

y = len(m) + 1 

或更好

while x in range(y + 1): 
+0

工作正常!谢谢!你的解释也很有帮助 –

+0

这是因为范围不包括从右边:范围(5)实际上返回[0,1,2,3,4]。所以,你不会做[7:7],而是[6:7]。在循环本身中处理这种情况会更好 - 使其范围(y + 1)。 – mpolednik

+0

抱歉,我刚刚删除了我的评论,因为我知道它在做什么。非常感谢! –

0

使用括号来获取列表的长度:

y = len(m) - 1 
+0

哇哦,我不能相信我错过了。谢谢! –

+0

无论如何,你可能应该使用mpolednik的答案。它更pythonic。 –

0

你的错误是在你的len

(len[m]) - 1 

len是一个函数,你不能索引或切片或不能。做到这一点,而不是:

y = len(m) - 1 

还有一个其他错误:

return new list 

应该是:(不能有空格变量)

return newlist