我正在尝试编写一个代码,当某个值是列表的中间元素时,将列表中的列表一分为二,然后生成两个列表,其中中间元素成为第一个列表的末尾元素,第二个元素中的第一个元素。
列表中可以有n个以上的中间元素,因此结果必须是n + 1个列表。
示例:
A = [[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],[16,17,18,19,20,21,22,23,24,25],[26,27,28,29]]
P = [4,7,13,20]
n = len(Points) # in this case n = 4
我正在寻找如下结果:
A = [[0,1,2,3,4],[4,5,6,7],[7,8,9,10,11,12,13],[13,14,15],[16,17,18,19,20],[20,21,22,23,24,25],[26,27,28,29]]
由于n = 4,它将产生5个列表,请注意,答案有6个列表,因为最后一个列表没有P in的任何值,因此保持不变。
由于我是python的新手,所以我无法产生任何东西,很难解决这个问题。
感谢您的帮助!
答案 0 :(得分:0)
您可以继续将子列表项追加到输出列表的最后一个子列表,如果当前项等于Points
中的下一个项,则将新的子列表追加到输出具有相同项目的项目,然后从Points
中弹出项目:
output = []
for l in List:
output.append([])
for i in l:
output[-1].append(i)
if Points and i == Points[0]:
output.append([i])
Points.pop(0)
使用示例输入,output
将变为:
[[0, 1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10, 11, 12, 13], [13, 14, 15], [16, 17, 18, 19, 20], [20, 21, 22, 23, 24, 25], [26, 27, 28, 29]]
答案 1 :(得分:0)
您可以首先恢复所提供值的所有索引,然后相应地进行切片。
def split_at_values(lst, values):
indices = [i for i, x in enumerate(lst) if x in values]
for start, end in zip([0, *indices], [*indices, len(lst)]):
yield lst[start:end+1]
values = {4, 7, 13, 20}
lst = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
print(*split_at_values(lst, values))
[0, 1, 2, 3, 4] [4, 5, 6, 7] [7, 8, 9, 10, 11, 12, 13] [13, 14, 15]
然后可以将其迭代地应用于输入列表A
,以得到所需的结果。或者,您可以使用itertools.chain.from_iterable
。
from itertools import chain
values = {4, 7, 13, 20}
lst_A = [[0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[16, 17, 18, 19, 20, 21, 22, 23, 24, 25],
[26, 27, 28, 29]]
output = list(chain.from_iterable(split_at_values(sublst, values) for sublst in lst_A))
print(output)
[[0, 1, 2, 3, 4],
[4, 5, 6, 7],
[7, 8, 9, 10, 11, 12, 13],
[13, 14, 15],
[16, 17, 18, 19, 20],
[20, 21, 22, 23, 24, 25],
[26, 27, 28, 29]]