gpt4 book ai didi

python - 如何在元素定界符上拆分列表

转载 作者:太空狗 更新时间:2023-10-29 19:30:13 25 4
gpt4 key购买 nike

<分区>

是否有简洁优雅的方法可以通过分隔元素将 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”方法感兴趣,其次是最有效的方法(例如 timeit 速度)。理想情况下,答案应该同时针对 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

将 itertools.groupby 与列表理解相结合。许多答案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 方法,而且我不是在询问拆分字符串的问题。我也不是在询问将元素字符串拆分为新元素。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com