使用分隔符从列表中制作Python子列表

11

例如,我有以下列表:

['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|']

希望通过 "|" 分割并拆分它,结果应该如下:

[[u'MOM', u'DAD'],[ u'GRAND'], [u'MOM', u'MAX', u'JULES']]

我该怎么做?我在网上只找到需要元素长度的子列表示例。

4个回答

15
>>> [list(x[1]) for x in itertools.groupby(['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'], lambda x: x=='|') if not x[0]]
[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']]

这个解决方案对我来说充满了魔力,但却完美地工作!谢谢你。 - W0bble
2
阅读groupby文档作为一个开始。 :-) - Martijn Pieters
1
完整的代码行为了清晰起见是:[list(x[1]) for x in itertools.groupby(myList, lambda x: x=='|') if not x[0]] - ninjagecko
@ninjagecko: 这就是为什么我在我的回答中将listlambda分开的原因。 - johnsyweb

10

itertools.groupby() 很好地完成了这个任务...

>>> import itertools
>>> l = ['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|']
>>> key = lambda sep: sep == '|'
>>> [list(group) for is_key, group in itertools.groupby(l, key) if not is_key]
[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']]

2
这个比被接受的答案更易读。你要上头啦! - Aran-Fey

1

使用普通的for循环的简单解决方案(已被groupby解决方案击败,顺便说一句,groupby更好!)

seq = ['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|']

S=[]
tmp=[]

for i in seq:
    if i == '|':
        S.append(tmp)
        tmp = []
    else:
        tmp.append(i)

# Remove empty lists
while True:
    try:
        S.remove([])
    except ValueError:
        break

print S

提供

[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']]

0
>>> reduce(
        lambda acc,x: acc+[[]] if x=='|' else acc[:-1]+[acc[-1]+[x]], 
        myList,
        [[]]
    )
[[], ['MOM', 'DAD'], ['GRAND'], ['MOM', 'MAX', 'JULES'], []]

当然,你会想要使用 itertools.groupby,但你可能需要注意我的方法“正确地”将空列表放在了两端。=)

当你说“正确”,这与问题或链接文章中所需的输出如何匹配? - johnsyweb
1
@Johnsyweb 我很清楚。然而,规范的语义不够优雅,应该等同于 [].split(token);输入只需省略末尾的 '|' - ninjagecko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接