如何在元素分隔符上拆分列表

时间:2017-12-05 20:30:49

标签: python list split

是否有简洁而优雅的方法通过分隔元素将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']]

with itertools.groupby

将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方法,我不是要求分割字符串。我也不是要求将元素字符串拆分为新元素。

2 个答案:

答案 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)