-1

我会在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
4

3 回答 3

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函数。

于 2013-11-11T08:28:37.747 回答
0

用这个

def list_decreaser(list1):  
      listresult = [] 
      for i in list1:
          list1 = list[:-1]  
          listresult.append(list1) 
      return listresult
于 2013-11-11T09:40:49.353 回答
0

问题是您一遍又一遍地附加相同的列表。你一直在原地改变列表,但你永远不会创建一个新列表。所以你最终会得到一个对同一个空列表的 N 个引用的列表。

这与两个常见问题解答中讨论的问题相同。我认为如何创建多维列表最好地说明了这一点。

无论如何,您需要做的是每次通过循环附加一个新列表。有两种方法可以做到这一点。

首先,您可以附加当前列表的副本,而不是列表本身:

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是 0,然后是 1,然后是 2,以此类推。您删除元素 0,然后删除元素 1(即原始元素 2),然后删除元素 2(即原始元素 4),最终得到一个IndexError. 即使您修复了“跳过索引”问题(在某处的常见问题解答中也对此进行了解释),您仍然会删除第一个元素而不是最后一个元素。您可以通过转动范围来解决此问题。但是,还有一种更简单的方法:每次只删除最后一个元素,而不是试图找出哪个x是正确的,你可以通过指定来做到这一点-1,或者只是pop不带参数地调用。然后你也可以使用一个更简单的循环:

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.

于 2013-11-11T08:41:42.530 回答