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

Jer*_*ass 10 python split list

是否有通过分隔元素将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']]
Run Code Online (Sandbox Code Playgroud)

看似过于复杂的工作示例

我已经调查了关于stackoverflow的文档和相关问题 - 下面引用了很多 - 这些都没有回答我的问题,并且总结了我的研究如下:几种方法确实产生了所需的输出,但是冗长而错综复杂,以及发生了什么(分裂了列表)并不是很明显 - 你真的不得不眯着眼睛.

还有更好的方法吗?我主要关注初学者的可读性(例如教学),规范/'Pythonic'方法,其次是最有效的方法(例如,时间速度).理想情况下,答案将解决Python 2.7和3.x.

有条件的.append()

循环遍历列表并附加到最​​后一个输出列表或添加新的输出列表.基于包含分隔符的示例,但已更改为排除它.我不确定如何使它成为一个单行,或者如果这甚至是可取的.

lspl = [[]]
for i in ldat:
    if i==dlim:
        lspl.append([])
    else:
        lspl[-1].append(i)
print(lspl) # prints: [['a', 'b'], ['a', 'b'], ['a', 'b']]
Run Code Online (Sandbox Code Playgroud)

与itertools.groupby

将itertools.groupby与列表理解相结合.许多答案包括分界符,这是基于那些排除分界符的.

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']]
Run Code Online (Sandbox Code Playgroud)

切片指数

一些相关问题讨论了如何在使用.index()后使用切片 - 但是答案通常只关注于查找第一个索引.可以通过首先查找索引列表然后循环遍历自我压缩列表来切割范围来扩展此方法.

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']]
Run Code Online (Sandbox Code Playgroud)

但是,就像我发现的所有方法一样,这似乎是一种非常复杂的方法来实现简单的分割分隔符操作.

与字符串拆分的比较

通过比较和仅作为模型,这是一种通过分隔符将字符串拆分为子字符串列表的工作,简洁和优雅的方式.

sdat = 'abcabcab'
dlim = 'c'
sspl = sdat.split(dlim)
print(sspl) # prints: ['ab', 'ab', 'ab']
Run Code Online (Sandbox Code Playgroud)

注意:我理解splitPython中的列表上没有方法,我不是要求分割字符串.我也没有问过将元素字符串拆分成新元素.

use*_*402 -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)
Run Code Online (Sandbox Code Playgroud)

  • https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html (3认同)
  • 哇。这在特定情况下确实“有效”,而且很简单,但它可能是不透明和危险的糟糕组合——我真的希望初学者不会从这个答案中剪切和粘贴。 (3认同)