簡體   English   中英

按特定值拆分列表

[英]Split list at a specific value

我正在嘗試編寫一個代碼,當某個值是列表的中間元素時,將一類列表中的列表分成兩部分,然后生成兩個列表,其中中間元素成為第一個列表中的結束元素和第二個。

列表中的中間元素可以超過 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 的新手,因此我無法產生任何東西,並且很難制定這個問題。

任何幫助表示贊賞!

您可以繼續將子列表項附加到輸出列表的最后一個子列表中,如果當前項等於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]]

您可以首先恢復所提供值的所有索引,然后相應地切片。

代碼

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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM