按特定值将列表拆分为多个列表

问题描述 投票:0回答:4

我有一个内部用 0 分隔的元素列表。 格式是这样的:

[0, 2, 2, 0, 1, 5, 5, 3, 1, 3, 0, 7, 4, 6, 7, 4, 6]

我想使用零作为分隔符并将其拆分为子列表。在该示例中:

[[], [2, 2], [1, 5, 5, 3, 1, 3], [7, 4, 6, 7, 4, 6]]

零将因此消失。 前导零或结尾零应该在开头或结尾处形成一个空列表。

直到知道,我以一种丑陋的方式做到了这一点,将列表连接到一个字符串中,然后将其拆分并再次制作一个列表。

有没有一种奇特的Pythonic方法可以更轻松地做到这一点?

python-3.x list split
4个回答
3
投票

您可以使用 groupby 方法:

from itertools import groupby
k = [0, 2, 2, 0, 1, 5, 5, 3, 1, 3, 0, 7, 4, 6, 7, 4, 6]

gr = groupby(k, lambda a: a==0)

l = [[] if a else [*b] for a,b in gr]

print(l)

输出:

[[], [2, 2], [], [1, 5, 5, 3, 1, 3], [], [7, 4, 6, 7, 4, 6]]

您可以通过以下方式修复内部[]:

l = [ a for idx,a in enumerate(l) if idx in (0,len(l)) or a]

获得

[[], [2, 2], [1, 5, 5, 3, 1, 3], [7, 4, 6, 7, 4, 6]]

您可以将列表替换为

l = []
for a,b in gr:
    if a: 
        l.append([])
    else: 
        l.append([*b])

2
投票

您可以使用以下解决方案解决此问题:Python split list at zeros

from itertools import groupby

def split_a_list_at_zeros(L):
    return [list(g) for k, g in groupby(L, key=lambda x:x!=0) if k]

list1 = [0, 2, 2, 0, 1, 5, 5, 3, 1, 3, 0, 7, 4, 6, 7, 4, 6]

new_list = split_a_list_at_zeros(list1)

print(new_list) # [[2, 2], [1, 5, 5, 3, 1, 3], [7, 4, 6, 7, 4, 6]]

1
投票

您可以使用这个:

def func(arr):
    indices = [-1] + [i for i in range(len(arr)) if arr[i] == 0] + [len(arr)]
    return [arr[indices[i] + 1 : indices[i + 1]] for i in range(len(indices) - 1)]

0
投票

非常直观的解决方案,但它会在每次传递后修改列表。使用索引、索引和外部列表来实际拆分它。

inp = [0, 2, 2, 0, 1, 5, 5, 3, 1, 3, 0, 7, 4, 6, 7, 4, 6]

out = []
split_on = 0

while inp:
    # accounts for the last split
    if split_on not in inp:
        out.append(inp)
        break

    end_index = inp.index(split_on)
    out.append(inp[:end_index])

    inp = inp[end_index+1:]

print(out)

# [[], [2, 2], [1, 5, 5, 3, 1, 3], [7, 4, 6, 7, 4, 6]]
© www.soinside.com 2019 - 2024. All rights reserved.