Python:如何根据分隔符将列表拆分为多个小列表
我有一个列表,里面包含以下字符串:
主列表
'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))