在Python中分割列表
我有一个对象的列表,现在我想把它变成一个列表的列表,用另一个列表里的对象来分割,像这样:
l = ['x',1,2,3,'a',5,6,1,7]
还有另一个对象的列表
s = ['a', 1, 4]
我希望得到的结果是这样的:
[ ['x'], [1, 2, 3], ['a', 5, 6], [1, 7] ]
有没有什么好用的、符合Python风格的方法来实现这个呢?
补充说明:
我希望每个结果列表的开头是列表中的一个元素,并且这些列表要保持初始列表中的元素顺序不变。
2 个回答
5
生成器可以很快帮你做到这一点:
def split_on_members(seq, s):
s = set(s)
chunk = []
for i in seq:
if i in s and chunk:
yield chunk
chunk = []
chunk.append(i)
if chunk:
yield chunk
这会得到:
>>> list(split_on_members(l, s))
[['x'], [1, 2, 3], ['a', 5, 6], [1, 7]]
当然,你可以直接遍历生成器,而不需要先创建一个完整的列表:
>>> for group in split_on_members(l, s):
... print group
...
['x']
[1, 2, 3]
['a', 5, 6]
[1, 7]
2
试试这两个函数,
第一个是“返回”类型
def overlap_split_list(l,s): l1 = [] l2 = [] for i in l: if i in s: l1.append(l2) l2 = [] l2.append(i) if l2: l1.append(l2) return l1
第二个是生成器类型
def generator_overlap_split_list(l,s): l2 = [] for i in l: if i in s: yield l2 l2 = [] l2.append(i) if l2: yield l2
输出结果(都是一样的)
print overlap_split_list(l,s)
print [i for i in generator_overlap_split_list(l,s)]
print list(generator_overlap_split_list(l,s))