【问题标题】:slice a list up to a given element将列表切片到给定元素
【发布时间】:2019-04-04 10:10:50
【问题描述】:

如果您有一个列表my_list = ['a', 'd', 'e', 'c', 'b', 'f'],并且您想构建一个子列表,其中包含直到给定元素的所有元素,例如my_list_up_to_c = ['a', 'd', 'e'],那么如何以一种易于扩展的方式完成呢?也可以通过使用 numpy 数组来加快速度吗?

【问题讨论】:

  • my_list[:my_list.index(2)] 我想。它应该类似于循环列表一次,在查找值的第一个实例处返回。在最坏的情况下应该是 O(n)

标签: python arrays python-3.x list


【解决方案1】:

最少的代码可能会使用.index()(请注意,这会搜索直到所述列表中第一次出现的元素):

>>> my_list = ['a', 'd', 'e', 'c', 'b', 'f']
>>> my_list
['a', 'd', 'e', 'c', 'b', 'f']
>>> my_list[:my_list.index('c')]          # excluding the specified element
['a', 'd', 'e']
>>> my_list[:my_list.index('c')+1]        # including the specified element
['a', 'd', 'e', 'c']

调用.index() 的时间复杂度是O(n),这意味着它最多会遍历列表一次。列表切片具有复杂性O(k)(根据this source),这意味着它取决于切片的大小。

所以在最坏的情况下,您要查找的元素位于列表的末尾,因此您的搜索将一直运行到列表的末尾 (O(n)),并且切片也会复制整个列表(还有 @ 987654329@),导致O(2n) 的最坏情况仍然是线性复杂度。

【讨论】:

    【解决方案2】:

    使用 index() 获取列表项的第一次出现。然后使用切片表示法获取列表的所需部分。

    >>> my_list = ['a', 'd', 'e', 'c', 'b', 'f']
    >>> my_list[:my_list.index('c')]
    ['a', 'd', 'e']
    

    【讨论】:

      【解决方案3】:

      itertools 解决方案

      In[9]: from itertools import takewhile
      In[10]: my_list = ['a', 'd', 'e', 'c', 'b', 'f'] 
      In[11]: list(takewhile(lambda x: x != 'c', my_list))
      Out[11]: ['a', 'd', 'e']
      

      在 Haskell 中是这样的

      takeWhile ((/=) 'c') "adecbf"
      

      【讨论】:

      • 请注意,这不允许在结果列表中包含指定的元素。也许这就是 OP 想要的,但值得指出这个限制。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2017-10-22
      • 2020-08-08
      • 2014-03-07
      相关资源
      最近更新 更多