簡體   English   中英

(Python 3)使用唯一元素作為分隔符拆分列表

[英](Python 3) Splitting a list using unique elements as separators

我有一個列表l=[2,3,4,5,6,99,7,8,9,10,11,12,100,13,14,15,16,17,18,101]我想分裂l進入子列表[2,3,4,5,6], [7,8,9,10,11,12],[13,14,15,16,17,18] ,意思是我使用'分隔符'數字99,100,101屬於separators = [99,100,101]作為標志,表示我應該進入下一個列表。

特別地,這些子列表可能不具有相同數量的元素,但是僅在1(5或6)的大小上不同。 注意:可能有超過3個分隔符。

有沒有一種有效的方法在Python 3中執行此操作? 我想到首先提取分隔符元素的索引,然后相應地切片列表,但它似乎太復雜和計算密集..

一些見解會很棒!

加上(來自@Netwave的建議):我的嘗試(顯然不起作用):

g = []
for i in l:
    if i in separators:
        g += [l[:l.index(i)]]

輸出:

>>> g
[[2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12], [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18]]

使用groupby

from itertools import groupby

separators = [99, 100, 101]
l = [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18, 101]

splits = [list(values) for key, values in groupby(l, key=lambda x: x not in separators) if key]

print(splits)

產量

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]

我希望你正在尋找類似於下面的代碼。 您需要迭代列表並繼續檢查元素是否存在於分隔符列表中。 這可以通過其他方式完成,正如您所說,迭代分隔符列表並查找主列表中元素的索引。 為了簡單起見,我采用了前一種方法。 (記下endindex變量的使用):

l=[2,3,4,5,6,99,7,8,9,10,11,12,100,13,14,15,16,17,18,101]
seperator = [99,100,101]

list_of_list = []
endindex = 0
for i in range(0,len(l),1):
    if l[i] in seperator:
        list_of_list.append(l[endindex:i])
        endindex = i + 1

print(list_of_list)

輸出繼電器:

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]

更容易在功能中使用:

import itertools
def split(l,l2):
    return [list(v) for k,v in itertools.groupby(l,lambda x: x in l2) if not k]
l = [2, 3, 4, 5, 6, 99, 7, 8, 9, 10, 11, 12, 100, 13, 14, 15, 16, 17, 18, 101]
print(split(l,[99, 100, 101]))

輸出:

[[2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]

實現了將列表拆分為值的嵌套列表的副本

暫無
暫無

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

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