нарезать список до заданного элемента - PullRequest
1 голос
/ 04 апреля 2019

Если у вас есть список my_list = ['a', 'd', 'e', 'c', 'b', 'f'] и вы хотите создать подсписок, содержащий все элементы вплоть до заданного, например my_list_up_to_c = ['a', 'd', 'e'], как это можно сделать так, чтобы его можно было легко масштабировать?Также можно ли сделать это быстрее, используя массивы numpy?

Ответы [ 3 ]

3 голосов
/ 04 апреля 2019

Наименьшее количество кода, вероятно, будет использовать .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) (согласно этому источнику ), то есть это зависит от размера среза.

Таким образом, в худшем случае искомый элемент находится в конце списка, поэтому поиск будет выполняться до конца списка (O(n)), а фрагмент также скопирует весь список (также O(n)), что приводит к наихудшему случаю O(2n), который по-прежнему имеет линейную сложность.

2 голосов
/ 04 апреля 2019

Используйте index (), чтобы получить первое вхождение элемента списка. Затем используйте обозначение среза, чтобы получить нужную часть списка.

>>> my_list = ['a', 'd', 'e', 'c', 'b', 'f']
>>> my_list[:my_list.index('c')]
['a', 'd', 'e']
1 голос
/ 04 апреля 2019

Решение 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']

В Хаскеле это будет

takeWhile ((/=) 'c') "adecbf"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...