我有一个对象列表,我希望得到一个对象列表,使用另一个列表中的对象进行拆分,如下所示:
l = ['x',1,2,3,'a',5,6,1,7]
和另一个对象列表
s = ['a', 1, 4]
我希望得到这样的结果:
[ ['x'], [1, 2, 3], ['a', 5, 6], [1, 7] ]
有没有一种不错的/pythonic的方式来做到这一点?
编辑:
我希望每个结果列表的头部都是 的元素s
,并且所有这些列表都使初始列表的元素保持相同的顺序。
我有一个对象列表,我希望得到一个对象列表,使用另一个列表中的对象进行拆分,如下所示:
l = ['x',1,2,3,'a',5,6,1,7]
和另一个对象列表
s = ['a', 1, 4]
我希望得到这样的结果:
[ ['x'], [1, 2, 3], ['a', 5, 6], [1, 7] ]
有没有一种不错的/pythonic的方式来做到这一点?
编辑:
我希望每个结果列表的头部都是 的元素s
,并且所有这些列表都使初始列表的元素保持相同的顺序。
生成器会很快为您完成:
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]
试试这两个功能,
“返回”类型
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))