是否有简洁而优雅的方法通过分隔元素将Python中的列表拆分为子列表列表,以便['a', 'delim', 'b']
- > [['a'], ['b']]
?
以下是示例:
ldat = ['a','b','c','a','b','c','a','b']
dlim = 'c'
lspl = [] # an elegant python one-liner wanted on this line!
print(lspl) # want: [['a', 'b'], ['a', 'b'], ['a', 'b']]
我已经调查了有关stackoverflow的文档和相关问题 - 下面引用了许多 - 这些都没有回答我的问题,并且总结了我的研究如下:做的几种方法生成了所需的输出,但是很详细并且错综复杂,正在发生的事情(拆分清单)并不是很明显 - 你真的不得不眯眼。
有更好的方法吗?我主要对初学者的可读性(例如教学),规范/和Pythonic'接近,其次是最有效的方法(例如,时间速度)。理想情况下,答案将解决Python 2.7和3.x.
带有条件的.append()遍历列表并附加到最后一个输出列表或添加新的输出列表。基于includes the delimiter的示例,但已更改为排除它。我不确定如何使它成为单线,或者甚至是可取的。
lspl = [[]]
for i in ldat:
if i==dlim:
lspl.append([])
else:
lspl[-1].append(i)
print(lspl) # prints: [['a', 'b'], ['a', 'b'], ['a', 'b']]
将itertools.groupby与list comprehension结合起来。许多答案include delimeters,这是基于那些exclude delimeters。
import itertools
lspl = [list(y) for x, y in itertools.groupby(ldat, lambda z: z == dlim) if not x]
print(lspl) # prints: [['a', 'b'], ['a', 'b'], ['a', 'b']]
一些相关问题讨论了如何在使用.index()之后使用切片 - 但是答案通常集中于找到first index only。可以通过第一个finding a list of indices扩展此方法,然后循环遍历自我压缩列表以对范围进行切片。
indices = [i for i, x in enumerate(ldat) if x == dlim]
lspl = [ldat[s+1:e] for s, e in zip([-1] + indices, indices + [len(ldat)])]
print(lspl) # prints: [['a', 'b'], ['a', 'b'], ['a', 'b']]
然而,就像我发现的所有方法一样,这似乎是一种非常复杂的方法,可以实现简单的分割分割操作。
通过比较和仅作为模型,这是一种工作,简洁,优雅的分裂方式 用分隔符将字符串转换为子字符串列表。
sdat = 'abcabcab'
dlim = 'c'
sspl = sdat.split(dlim)
print(sspl) # prints: ['ab', 'ab', 'ab']
注意:我理解Python中的列表中没有split
方法,我不是要求分割字符串。我也不是要求将元素字符串拆分为新元素。
答案 0 :(得分:-1)
不确定更简洁或优雅",但是如何:
ldat = ['a','b','c','a','b','c','a','b']
string_joined = ",".join(str(x) for x in ldat)
split_array = [[x] for x in string_joined.split(',c')]
如果你真的想要它在一行:
split_array = [[x] for x in ",".join(str(x) for x in ldat).split(',c')]
答案 1 :(得分:-4)
或者这个:
ldat = ['a','b','c','a','b','c','a','b']
dlim = 'c'
lspl = [] # an elegant python one-liner wanted on this line!
print(lspl) # want: [['a', 'b'], ['a', 'b'], ['a', 'b']]
s = str(ldat).replace(", '%s', " % dlim, "],[")
result = eval(s)
print(result)