【问题标题】:How to slice middle element from list如何从列表中切片中间元素
【发布时间】:2015-08-25 18:37:32
【问题描述】:

相当简单的问题。假设我有一个类似的列表:

a = [3, 4, 54, 8, 96, 2]

我可以使用切片来省略列表中间的一个元素来生成这样的东西吗?

a[some_slicing]
[3, 4, 8, 96, 2]

元素 54 是否被遗漏了。我猜这会解决问题:

a[:2:]

但结果不是我所期望的:

[3, 4]

【问题讨论】:

  • 我不明白你所说的切片和从列表中弹出一个元素有什么区别?...老实说,我看不出有什么区别?...你的点这里称之为切片?..而不是删除一个元素?
  • 因为我不想从列表中删除一个元素,所以我想解包它的元素,在中间留下一个:例如:a1, a2, a3, a4, a5 = a[:2:](这当然不起作用)跨度>
  • 如果您要投反对票,请发表评论,以便我知道您为什么认为这个问题没有价值?否则,我无能为力,也无法从中吸取教训,以后也无法避免。
  • 我相信问题是,你是否可以用一个切片弹出,答案是否定的。另请参阅post
  • 铁拳,最大的区别是前者返回一个列表,而后者返回None。对于那些喜欢干净、优雅的解决方案的人来说,能够将操作的结果传递给下一个可能很重要。

标签: python slice


【解决方案1】:

你不能用一个切片来模拟 pop,因为一个切片只给你一个开始和结束索引。

但是,您可以使用两个切片:

>>> a = [3, 4, 54, 8, 96, 2]
>>> a[:2] + a[3:]
[3, 4, 8, 96, 2]

你可以把它包装成一个函数:

>>> def cutout(seq, idx):
        """
        Remove element at `idx` from `seq`.
        TODO: error checks.
        """
        return seq[:idx] + seq[idx + 1:]

>>> cutout([3, 4, 54, 8, 96, 2], 2)
[3, 4, 8, 96, 2]

但是,pop 将是 faster。列表弹出功能在listobject.c中定义。

【讨论】:

  • 谢谢 miku,我想知道是否有办法使用列表中的一个片段来做到这一点,但我想答案是“不”。
【解决方案2】:

将这两个部分分别切片并添加这些列表

a[:2] + a[3:]

【讨论】:

    【解决方案3】:

    要删除项目就地调用:

    your_list.pop(index)
    

    它将返回删除的项目并更改your_list

    【讨论】:

    • 但是在大​​型列表中这可能会很慢,因为index 之后的所有内容都需要向前移动。
    • 在大型列表中,它比切片复制方法快得多。 timeit.timeit('your_list.pop(1)', setup='your_list=range(10**6)', number=1000)1.010901927947998; timeit.timeit('your_list = your_list[:4] + your_list[5:]', setup='your_list=range(10**6)', number=1000)23.652629137039185
    • @KlausD.,感谢您的时间。将您的答案链接到我的答案中。
    【解决方案4】:

    要处理任何大小的列表:

    a.pop((len(a)-1)//2)
    

    【讨论】:

    • 这就是我要找的东西
    【解决方案5】:

    这是最简单的答案:

    >>>a = [3, 4, 54, 8, 96, 2]

    >>>a.remove(54)

    [3, 4, 8, 96, 2]

    【讨论】:

    • 这不是一个好的解决方案,好像数字未知但只想过滤掉位置/inex。
    【解决方案6】:

    我会选择列表理解:

    >>> a = [3, 4, 54, 8, 96, 2]
    >>> a_ = [list(j for idx, j in enumerate(a) if idx != 2)]
    >>> [3, 4, 8, 96, 2]
    

    【讨论】:

      猜你喜欢
      • 2018-08-17
      • 2021-01-20
      • 2010-10-11
      • 2013-09-27
      • 1970-01-01
      • 2014-10-14
      • 2016-09-16
      • 2018-09-12
      • 2016-03-10
      相关资源
      最近更新 更多