如果您有一个列表my_list = ['a', 'd', 'e', 'c', 'b', 'f']
,并且想要构建一个子列表,其中包含直到一个给定元素的所有元素,例如my_list_up_to_c = ['a', 'd', 'e']
,那么如何以易于扩展的方式来完成此操作?还可以通过使用numpy数组来使其更快吗?
答案 0 :(得分:3)
最少的代码可能会使用Spotify Docker client(请注意,这会一直搜索到所述列表中元素的第一次出现):
ContainerExit
调用docker.waitContainer()
的时间复杂度为>>> 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()
(根据.index()
),这意味着它取决于切片的大小。
因此,在最坏的情况下,您要查找的元素位于列表的末尾,因此您的搜索将一直运行到列表的末尾(O(n)
),并且切片也会复制整个列表( O(k)
),导致O(n)
的最坏情况仍然是线性复杂度。
答案 1 :(得分:2)
使用index()获取列表项的首次出现。然后使用切片符号获取列表的所需部分。
>>> my_list = ['a', 'd', 'e', 'c', 'b', 'f']
>>> my_list[:my_list.index('c')]
['a', 'd', 'e']
答案 2 :(得分:1)
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"