2016-11-25 3 views
-4

У меня действительно длинный список. Ниже приводится отрывок из него.Создать подсписки, разделив список по значению

['1', '15943882', '63', '1', '-9', '-9', '-9', '-27', '1', '145', 
'1', '233', '-9', '50', '20', '1', '0', '1', '2', '2', '3', 
'1981', '0', '0', '0', '0', '0', '1', '10.5', '6', '13', '150', 
'60', '190', '90', '145', '85', '0', '0', '2.3', '3', '-9', '-9', 
'0', '-9', '-9', '-9', '-9', '-9', '-9', '6', '-9', '-9', '-9', 
'2', '16', '1981', '0', '1', '1', '1', '-9', '1', '-9', '1', 
'-9', '1', '1', '1', '1', '1', '1', '1', '-9', '-9', '0', '-9', 
'-9', '-9', '-9', '-9', '-9', '-9', '-9', '-9', '0', '0', '0', 
'0', 'name', '2', '15964847', '67', '1', '-9', '-9', '-9', '-27', 
'4', '160', '1', '286', '-9', '40', '40', '0', '0', '1', '2', 
'3', '5', '1981', '0', '1', '0', '0', '0', '1', '9.5', '6', 
'13', '108', '64', '160', '90', '160', '90', '1', '0', '1.5', 
'2', '-9', '-9', '3', '-9', '-9', '-9', '-9', '-9', '-9', '3', 
'-9', '-9', '-9', '2', '5', '1981', '2', '1', '2', '2', '-9', 
'2', '-9', '1', '-9', '1', '1', '1', '1', '1', '1', '1', '-9', 
'-9', '0', '-9', '-9', '-9', '-9', '-9', '-9', '-9', '-9', '-9', 
'0', '0', '0', '0', 'name'] 

Как создать 2 списка, который расщепляет при значении 'name'? Индекс со значением 'name' не всегда совпадает по всему списку, fyi.

+0

использовать 'my_list. index ('name') ', чтобы получить индекс, где вам нужно разделить ... – Julien

+0

Что делать, если в списке есть несколько' name'? вы хотите, чтобы раскол был рекурсивным? –

+1

Как всегда, это не служба написания кода. Что вы пробовали? –

ответ

1

Чтобы разделить список на нескольких name элементов, которые можно использовать itertools.groupby() из стандартных модулей:

>>> import itertools as it 
>>> data = ['1', '15943882', '63', '1', '-9', '-9', '-9', '-27', '1', '145', '1', ...] 
>>> [list(g) for k, g in it.groupby(data, lambda x: x=='name') if not k] 
[['1', '15943882', '63', '1', '-9', '-9', '-9', '-27', '1', '145', ... 
['2', '15964847', '67', '1', '-9', '-9', '-9', '-27', '4', '160', ... 
0
idx = x.index('name') 
(x[0:idx], x[idx+1:]) 

Это разделило бы на первый индекс «имя».

1

Существует split функции в библиотеке iteration_utilities, которые могут быть полезны в этом контексте:

>>> from iteration_utilities import split 
>>> l1, l2 = split(your_list, key='name', eq=True) 
>>> l1 
['1', '15943882', '63', '1', '-9', '-9', '-9', '-27', '1', '145', '1', 
'233', '-9', '50', '20', '1', '0', '1', '2', '2', '3', '1981', '0', 
'0', '0', '0', '0', '1', '10.5', '6', '13', '150', '60', '190', '90', 
'145', '85', '0', '0', '2.3', '3', '-9', '-9', '0', '-9', '-9', '-9', 
'-9', '-9', '-9', '6', '-9', '-9', '-9', '2', '16', '1981', '0', '1', 
'1', '1', '-9', '1', '-9', '1', '-9', '1', '1', '1', '1', '1', '1', 
'1', '-9', '-9', '0', '-9', '-9', '-9', '-9', '-9', '-9', '-9', '-9', 
'-9', '0', '0', '0', '0'] 

Обратите внимание, что это удаляет key (в данном случае 'name') от результатов.

Функция также может разбить список на несколько частей, если это не нужно, вы можете указать maxsplit=1.

Примечание: Я являюсь автором библиотеки iteration_utilities. Просто говорить об этом: Это также легко реализовать эту функцию в чистом Python:

def split(iterable, delimiter): 
    lst = [] 
    for item in iterable: 
     if item == delimiter: 
      yield lst 
      lst = [] 
     else: 
      lst.append(item) 
    if lst: 
     yield lst 
Смежные вопросы