【问题标题】:Python List removal issue [duplicate]Python列表删除问题[重复]
【发布时间】:2013-07-26 00:36:46
【问题描述】:

我正在从列表中删除元素。但是使用for 遍历元素,我可以看到正在访问备用元素,因此所有元素都没有被删除。

代码

l = ['A','B','C','D','E','F']
for x in l:
    l.remove(x)
    print "My List:"+str(l)
print "Final List:"+str(l)

输出

My List:['B', 'C', 'D', 'E', 'F']
My List:['B', 'D', 'E', 'F']
My List:['B', 'D', 'F']
Final List:['B', 'D', 'F']

您能否对这个逻辑进行任何修改以解决问题。或者,如果有更好的方法来解决这个问题。

【问题讨论】:

    标签: python list python-2.6


    【解决方案1】:

    你不应该修改你正在迭代的列表,否则你一定会得到奇怪的结果。

    而是遍历列表的副本:

    for x in l[:]:
        l.remove(x)
    

    【讨论】:

      【解决方案2】:

      复制列表的替代方法(考虑到上下文,imo 会更有意义):

      In [1]: from collections import deque
      In [2]: l = deque(['A','B','C','D','E','F'])
      In [3]: while len(l) > 0:
         ...:     l.popleft()
         ...:     print l
         ...:     
      deque(['B', 'C', 'D', 'E', 'F'])
      deque(['C', 'D', 'E', 'F'])
      deque(['D', 'E', 'F'])
      deque(['E', 'F'])
      deque(['F'])
      deque([])
      

      【讨论】:

        【解决方案3】:

        这个怎么样?这不构成任何新列表。

        l = ['A','B','C','D','E','F']
        while l: del l[0]; print("My List:"+str(l))
        
        print("Final List:"+str(l))
        

        【讨论】:

          【解决方案4】:

          您可以将其切片,而不是从列表中删除元素:

          l = ['A','B','C','D','E','F']
          for i in range(len(l) + 1):
              print "My List:"+str(l[i:])
          

          【讨论】:

          • 这会留下列表中的最后一个元素,而不是返回一个空白列表。
          • 只需将一个添加到len(l) 然后。
          【解决方案5】:

          看来您想要的只是从列表中删除所有元素。我认为您可以使用:

          l = []
          

          或者如果有条件,可以使用列表推导:

          [x for x in l in if x ...]
          

          【讨论】:

          • l[:] = [] 清空现有列表,因此对它的任何其他引用也将看到空列表。 l = [] 重新绑定到一个新的空列表,所以略有不同
          • 为什么l[:] = [] 清空l?我试过了,但我不明白为什么。 l[:] 只是 l 的副本。
          • @zhangyangyu:l[:] = ... 是对l 切片的赋值。作为一个独立的表达式,l[:]l 的一个副本,但是当它位于赋值的左侧时,这意味着 l 中的所有项目都被替换为序列中的项目右手边。您也可以使用其他切片。例如,l[2:3] = [40,50,60] 将索引 2 处的值替换为 40,50,60
          • 非常感谢!当你说l[2:3] = [40, 50, 60] 时,一切都变得显而易见。@unutbu
          猜你喜欢
          • 2019-04-15
          • 2011-07-21
          • 1970-01-01
          • 2010-12-29
          • 1970-01-01
          • 1970-01-01
          • 2014-07-14
          • 2012-07-11
          • 1970-01-01
          相关资源
          最近更新 更多