我在python中创建一个函数,给定一个列表返回一个列表列表,其中每个元素都是给定的列表减少一个。
Input: list_decreaser([0,3,4,5,6,7,8)
Output: [[0,3,4,5,6,7],[0,3,4,5,6],[0,3,4,5],[0,3,4],[0,3],[0]]
我的尝试:
def list_decreaser(list):
listresult = []
for x in range(len(list)-1):
list.remove(list[x])
listresult.append(list)
return listresult
答案 0 :(得分:2)
代码多次追加相同的列表。它应该附上清单的副本。
使用del list[..]
代替list.remove(list[..])
删除特定索引处的项目。
def list_decreaser(xs):
listresult = []
for i in range(len(xs)-1, 0, -1): # <--- interate backward
del xs[i]
listresult.append(xs[:]) # <----
return listresult
print(list_decreaser([0,3,4,5,6,7,8]))
或使用列表理解:
>>> xs = [0,3,4,5,6,7,8]
>>> [xs[:i] for i in range(len(xs)-1, 0, -1)]
[[0, 3, 4, 5, 6, 7], [0, 3, 4, 5, 6], [0, 3, 4, 5], [0, 3, 4], [0, 3], [0]]
顺便说一句,不要使用list
作为变量名。它影响内置list
功能。
答案 1 :(得分:0)
问题是你一遍又一遍地追加同一个名单。你一直在改变列表,但你永远不会创建一个新的列表。因此,您最终得到了对同一个空列表的N个引用列表。
这是两个FAQ问题中讨论的问题。我认为How do I create a multidimensional list最能解释它。
无论如何,你需要做的是每次循环都附加一个新列表。有两种方法可以做到这一点。
首先,您可以附加当前列表的副本,而不是列表本身:
def list_decreaser(list):
listresult = []
for x in range(len(list)-1):
list.remove(list[x])
listresult.append(list[:]) # this is the only change
return listresult
这解决了您的问题,但它留下了一些新问题:
首先,list.remove(list[x])
是一个非常糟糕的主意。如果你给它,比如[0, 1, 2, 0]
,当你试图删除第二个0
时会发生什么?你正在呼叫list.remove(0)
,并且列表无法知道你想要第二个0
而不是第一个del list[x]
!正确的做法是致电list.pop(x)
或x
。
但是一旦你解决了这个问题,你就会从错误的方面移除元素。 IndexError
为0,然后是1,然后是2,依此类推。删除元素0,然后删除元素1(原始元素2),然后删除元素2(原始元素4),最后得到x
。即使您修复了“跳过索引”问题(也在FAQ中解释过),您仍然会删除第一个元素而不是最后一个元素。你可以通过改变范围来解决这个问题。但是,有一个更简单的方法:每次只删除最后一个元素,而不是试图找出哪个-1
是正确的,你可以通过指定pop
,或只是调用{{}来做1}}没有参数。然后你也可以使用更简单的循环:
def list_decreaser(list):
listresult = []
while list:
list.pop()
listresult.append(list[:])
return listresult
当然,这会附加最后一个空列表,您显然不想要它。您可以通过执行while len(list) >= 1
,或if list: listresult.append(list[:])
或以其他各种方式解决此问题。
或者,您可以创建新的截断列表,而不是一遍又一遍地截断和复制相同的列表:
def list_decreaser(list):
listresult = []
while len(list):
list = list[:-1]
listresult.append(list)
return listresult
请注意,在第二个版本中,我们创建一个新列表并将该新列表存储在list
中,而不是更改list
中存储的值。
答案 2 :(得分:0)
使用此
def list_decreaser(list1):
listresult = []
for i in list1:
list1 = list[:-1]
listresult.append(list1)
return listresult