给定列表的函数返回列表减少的列表

时间:2013-11-11 08:23:39

标签: python list

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

3 个答案:

答案 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