Python: как разбить список на неизвестное количество меньших списков на основе разделителя - PullRequest
1 голос
/ 09 мая 2011

У меня есть список, который содержит следующие строки:

MainList
'00: 00'
'00: 01'
'00: 02'
'00: 03'
'00: 04'
'00: 00'
'00: 01'
'00: 02'
'00: 03'
'00: 04 '

Я бы хотел разделить это на меньшее количество списков всякий раз, когда встречается «00: 00», поскольку «00: 00» - единственный элемент, который не изменится:

Желаемый вывод:
List1
'00: 00'
'00: 01'
'00: 02'
'00: 03'
'00: 04'

List2
'00: 00'
'00: 01'
'00: 02'
'00: 03'
'00: 04'

Я попытался посмотреть на нарезку списка, но проблема в том, что последнее значение и, как таковое, количество элементов могут измениться. Более того, я не уверен, сколько меньших списков мне понадобится (и как бы я динамически создал n чисел меньших списков?)

Ответы [ 4 ]

5 голосов
/ 09 мая 2011

Я обычно делаю это:

def splitby( lst, breaker='00:00'):
    current = []
    it = iter(lst)
    first = next(it)
    assert first==breaker, "`lst` must begin with `breaker`"
    for item in it:
        if item == breaker:
            yield current
            current = []
        current.append(item)
    yield current

Неизбежное решение itertools немного более общее:

from itertools import groupby

class splitter(object):

    def __init__(self, breaker):
        self.breaker = breaker
        self.current_group = 0

    def __call__(self, item):
        if item == self.breaker:
            self.current_group+=1
        return self.current_group

    def group(self, items):
        return (list(v) for k,v in groupby(items,self))

print list(splitter('00:00').group(items))
3 голосов
/ 09 мая 2011

Явным образом, вы можете сделать так:

sep = '00:00'
split_list = []
for item in Mainlist:
    if item == sep:
        split_list.append([item])
    else:
        split_list[-1].append(item)

print split_list
2 голосов
/ 09 мая 2011

Понимания - ваш лучший друг :). Всего две строчки:

>>> a=['00:00', '00:01', '00:02', '00:03', '00:00', '00:01', '00:02']
>>> found=[index for index,item in enumerate(a) if item=='00:00'] + [len(a)]
>>> [a[found[i]:found[i+1]] for i in range(len(found)-1)]
[['00:00', '00:01', '00:02', '00:03'], ['00:00', '00:01', '00:02']]

Вот что мы делаем:

Мы ищем позиции разделителя и получаем список, который содержит индексы разделителя:

>>> found=[index for index,item in enumerate(a) if item=='00:00']
>>> found
[0, 4]

Мы добавляем len (a) для включения последнего диктанта.

И создание новых списков с разбивкой по найденным индексам:

>>> [a[found[i]:found[i+1]] for i in range(len(found)-1)]
[['00:00', '00:01', '00:02', '00:03'], ['00:00', '00:01', '00:02']]
0 голосов
/ 16 сентября 2013

Я мог бы придумать другой способ: -)

def list_split(a):
    #a=['00:00', '00:01', '00:02', '00:03', '00:00', '00:01', '00:02']
    output = []
    count = 0

    if len(a) < 1:
        output.append(a)
        return output

    for i, item in enumerate(a[1:]):
        if item == a[0]:
            output.append(a[count:i+1])
            count = i + 1
    else:
        output.append(a[count:])
        return output
...