【问题标题】:deleting values from a list in python three [closed]从python 3中的列表中删除值[关闭]
【发布时间】:2013-11-15 17:37:58
【问题描述】:

我想编写一个函数,从列表中删除偶数(例如 xs=[1,2,3,4,5,6]),然后返回剩余的列表。需要帮助。谢谢 注意:我不能使用任何内置函数,如删除排序等,只能使用删除语句。

【问题讨论】:

  • 然后呢?你都尝试了些什么?你被困在哪里了?
  • 好吧,既然没有delete 语句,我猜你的任务会失败。

标签: python list function python-3.x


【解决方案1】:

由于需要返回剩余的列表,所以不应该删除而是过滤:

[v for v in xs if v % 2 == 1]

这将创建一个包含所有奇数的列表:

>>> xs = [1, 2, 3, 4, 5, 6]
>>> [v for v in xs if v % 2 == 1]
[1, 3, 5]

【讨论】:

    【解决方案2】:

    明显的方法不起作用:

    for index, value in enumerate(xs):
        if not value % 2:
            del xs[index]
    

    或者,更糟糕的是,它恰好在这种特殊情况下有效,但这只是因为你非常幸运(你的老师甚至可能指望你落入这个陷阱)。

    为什么?好吧,当你del i[0] 时,这会降低其他所有内容。所以当你下次检查i[1]时,那不是原来的i[1],而是原来的i[2]。你永远不会检查,因此永远不能删除原始的i[1]

    这在 for.* 的文档中的一个灰色大注释中进行了解释。*


    正如 Martijn Pieters 所说,最好的解决方案是一开始就不要删除。

    如果您不关心改变原始列表(如果没有其他对象引用相同的列表,并且您的老师不喜欢技巧问题,您不必关心),只需创建并返回一个新列表,如他的回答。即使您确实需要改变原始列表,xs[:] = [v for v in xs if v % 2 == 1] 也会这样做,就像就地删除一样。

    但如果您出于某种原因必须就地删除(听起来可能是您的任务的要求),最简单的方法是从头开始向后工作:

    for index, value in list(enumerate(xs))[::-1]:
        if not value % 2:
            del xs[index]
    

    由于从列表中删除一个值只会将其后的值向下移动,因此以相反的顺序遍历列表意味着我们永远不会迷路并跳过我们想要测试的元素。


    * 这个解释读起来像 Python 1.x 的东西;既然迭代器协议是公开的,他们真的不需要谈论将内部计数器保存在某个未指定的地方......

    【讨论】:

      【解决方案3】:
      xs=[1,2,3,4,5,6]
      
      not_even = []
      for i in xs:
          if i%2 != 0:
              not_even.append(i)
      
      print not_even
      #output: [1, 3, 5]
      

      您也可以使用列表推导来做到这一点:

      [i for i in xs if i%2 != 0]
      

      【讨论】:

      • 这只是 Martijn Pieters 答案的冗长版本,没有解释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多