将列表拆分为特定值的多个列表
Split list into several lists at specific values
我有一个内部由 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 方法可以更轻松地做到这一点?
你可以使用这个:
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)]
您可以使用 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]]
您可以将列表 comp 替换为
l = []
for a,b in gr:
if a:
l.append([])
else:
l.append([*b])
您可以使用以下解决方案解决此问题: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]]
我有一个内部由 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 方法可以更轻松地做到这一点?
你可以使用这个:
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)]
您可以使用 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]]
您可以将列表 comp 替换为
l = []
for a,b in gr:
if a:
l.append([])
else:
l.append([*b])
您可以使用以下解决方案解决此问题: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]]