使用分隔符从列表中生成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'], []]