Python:如何根据分隔符将列表拆分为多个小列表

2 投票
4 回答
2370 浏览
提问于 2025-04-16 17:16

我有一个列表,里面包含以下字符串:

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

我想在遇到'00:00'的时候,把这个列表分成几个小列表,因为'00:00'是唯一不会变化的元素:

想要的结果:
列表1
'00:00'
'00:01'
'00:02'
'00:03'
'00:04'

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

我试着查看列表切片,但问题是最后一个值和元素的数量可能会变化。而且,我也不确定我需要多少个小列表(我该如何动态创建n个小列表呢?)

4 个回答

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:

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

你可以用一种明确的方式这样做:

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
6

我通常是这样做的:

def splitby( lst, breaker='00:00'):
    current = []
    it = iter(lst)
    first = next(it)
    assert first==breaker, "`lst` must begin with `breaker`"
    current.append(first)
    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))

撰写回答