如何使用标记元素拆分列表?

德米特里·库兹米诺夫

我正在尝试使用一些元素作为标记在 Python 中拆分列表。例如,考虑以下列表:

["marker1", "elem1", "elem2", "marker2", "elem3"]

我希望将其拆分为 2 个子列表:

[["marker1", "elem1", "elem2"], ["marker2", "elem3"]]

如果第一个元素不是标记,则标记之前的元素应被视为单独的子列表:

# From:
["elem1", "elem2", "marker1", "elem3", "marker2", "elem4", "elem5"]
# To:
[["elem1", "elem2"], ["marker1", "elem3"], ["marker2", "elem4", "elem5"]]

使用常规循环很容易做到:

lst = ["elem1", "elem2", "marker1", "elem3", "marker2", "elem4", "elem5"]

separated = []
sub_lst = []
for elem in lst:
    if elem[:6] == "marker" and sub_lst:
        separated.append(sub_lst)
        sub_lst = []
    sub_lst.append(elem)
if sub_lst:
    separated.append(sub_lst)

这段代码有 9 行长。我的问题是如何使用列表理解或任何其他功能样式在一行(左右)中做到这一点。也欢迎任何其他优雅的解决方案。

凯利邦迪

在开头或标记处创建(并包含)一个新的内部列表,否则附加到当前的内部列表(在线尝试!):

a = None
separated = [a := [x] for x in lst if not a or x.startswith('marker') or a.append(x)]

另一个(在线尝试!):

separated = [
    a
    for a in [None]
    for x in lst
    if not a or x.startswith('marker') or a.append(x)
    for a in [[x]]
]

还有一个(未经测试,现在无法测试):

from more_itertools import split_before

separated = list(split_before(lst, lambda s: s.startswith('marker')))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章