Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用分隔符从列表中生成Python子列表_Python_Split_Sublist - Fatal编程技术网

使用分隔符从列表中生成Python子列表

使用分隔符从列表中生成Python子列表,python,split,sublist,Python,Split,Sublist,例如,我有以下清单: ['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'] 并希望它被“|”分割,结果如下所示: [[u'MOM', u'DAD'],[ u'GRAND'], [u'MOM', u'MAX', u'JULES']] 我该怎么做?我只在网上找到一些子列表的例子,这些子列表需要一段长度的元素这样做很好 >>> [list(x[1]) for x in itertools.

例如,我有以下清单:

['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|']
并希望它被“|”分割,结果如下所示:

[[u'MOM', u'DAD'],[ u'GRAND'], [u'MOM', u'MAX', u'JULES']]
我该怎么做?我只在网上找到一些子列表的例子,这些子列表需要一段长度的元素

这样做很好

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

使用普通旧for循环的简单解决方案(groupby解决方案优于它,顺便说一句,哪个更好!)

给予


当然,您会希望使用
itertools.groupby
,不过您可能希望注意,我的方法“正确”地将空列表放在末尾。=)

这个解决方案对我来说充满了魔力,但效果非常完美!首先感谢您的阅读。:-)为了清楚起见,整行是:
[list(x[1])表示itertools.groupby(myList,lambda x:x=''|')如果不是x[0]
@ninjagecko:这就是为什么我在中拆分了
列表和
lambda
。当你说“正确”时,这与问题或链接文章的期望输出如何匹配?@Johnsyweb我很清楚。然而,规范的语义并不雅致,应等同于
[]。拆分(令牌)
;输入应该只在末尾去掉
“|”
。这比公认的答案更具可读性。你去顶上!
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']]
>>> reduce(
        lambda acc,x: acc+[[]] if x=='|' else acc[:-1]+[acc[-1]+[x]], 
        myList,
        [[]]
    )
[[], ['MOM', 'DAD'], ['GRAND'], ['MOM', 'MAX', 'JULES'], []]