Python:如何基于分隔符将列表拆分为未知数量的较小列表

时间:2011-05-09 12:18:28

标签: python list split

我有一个包含以下字符串的列表:

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'

列表2
'00:00'
'00:01'
'00:02'
'00:03'
'00:04'

我尝试查看列表切片,但问题是最后一个值,因此,元素的数量可能会改变。而且,我不确定我需要多少个较小的列表(以及我如何动态创建n个较小的列表?)

4 个答案:

答案 0 :(得分:5)

我通常这样做:

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))

答案 1 :(得分:3)

以明确的方式,您可以这样做:

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 :(得分:2)

理解是你最好的朋友:)。只有两行:

>>> 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']]

答案 3 :(得分:0)

我可以想到另一种方式: - )

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