我正在嘗試使用一些元素作為標記在 Python 中拆分串列。例如,考慮以下串列:
["marker1", "elem1", "elem2", "marker2", "elem3"]
我希望將其拆分為 2 個子串列:
[["marker1", "elem1", "elem2"], ["marker2", "elem3"]]
如果第一個元素不是標記,則標記之前的元素應被視為單獨的子串列:
# From:
["elem1", "elem2", "marker1", "elem3", "marker2", "elem4", "elem5"]
# To:
[["elem1", "elem2"], ["marker1", "elem3"], ["marker2", "elem4", "elem5"]]
使用常規回圈很容易做到:
lst = ["elem1", "elem2", "marker1", "elem3", "marker2", "elem4", "elem5"]
separated = []
sub_lst = []
for elem in lst:
if elem[:6] == "marker" and sub_lst:
separated.append(sub_lst)
sub_lst = []
sub_lst.append(elem)
if sub_lst:
separated.append(sub_lst)
這段代碼有 9 行長。我的問題是如何使用串列理解或任何其他功能樣式在一行(左右)中做到這一點。也歡迎任何其他優雅的解決方案。
uj5u.com熱心網友回復:
在開頭或標記處創建(并包含)一個新的內部串列,否則附加到當前的內部串列(在線嘗試!):
a = None
separated = [a := [x] for x in lst if not a or x.startswith('marker') or a.append(x)]
另一個(在線嘗試!):
separated = [
a
for a in [None]
for x in lst
if not a or x.startswith('marker') or a.append(x)
for a in [[x]]
]
還有一個(未經測驗,現在無法測驗):
from more_itertools import split_before
separated = list(split_before(lst, lambda s: s.startswith('marker')))
uj5u.com熱心網友回復:
您可以查找marker串列中元素的索引,然后根據這些位置獲取子串列:
lst = ["elem1", "elem2", "marker1", "elem3", "marker2", "elem4", "elem5"]
idxs = [i for i, v in enumerate(lst) if type(v) == str and v.startswith('marker')]
separated = [lst[i:j] for i, j in zip([0] idxs, idxs [len(lst)]) if i < j]
# [['elem1', 'elem2'], ['marker1', 'elem3'], ['marker2', 'elem4', 'elem5']]
lst = ["marker1", "elem1", "elem2", "marker2", "elem3"]
idxs = [i for i, v in enumerate(lst) if type(v) == str and v.startswith('marker')]
separated = [lst[i:j] for i, j in zip([0] idxs, idxs [len(lst)]) if i < j]
# [['marker1', 'elem1', 'elem2'], ['marker2', 'elem3']]
改編自這個答案。
uj5u.com熱心網友回復:
這是i看起來的樣子,[['elem1', 'elem2'],['marker1'],['elem3'],['marker2'],['elem4', 'elem5'],['marker3'],['elem6', 'elem7']]但當然是在生成器中
所以我們使用zipand iasgenerator將每兩個串列組合在一起['elem1', 'elem2'] ['marker1']
from itertools import groupby
lst = ["elem1", "elem2", "marker1", "elem3", "marker2", "elem4", "elem5", "marker3", "elem6", "elem7"]
i = (list(g) for _, g in groupby(lst, key=lambda x: x.startswith('marker')))
print([a b for a, b in zip(i, i)])
編輯1
from itertools import groupby, zip_longest
lst = ["marker0", "elem1", "elem2", "marker1", "elem3", "marker2", "elem4", "elem5", "marker3", "elem6", "elem7"]
i = (list(g) for _, g in groupby(lst, key=lambda x: x.startswith('marker')))
print([a b for a, b in zip_longest(i, i, fillvalue=[])])
編輯2
from itertools import groupby, zip_longest
lst = ["elem1", "elem2", "marker1", "elem3", "marker2", "elem4", "elem5", "marker3", "elem6", "elem7"]
i = iter([[]] [list(g) for _, g in groupby(lst, key=lambda x: x.startswith('marker'))])
print([a b for a, b in zip_longest(i, i, fillvalue=[])])
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/490561.html
上一篇:寫入文本檔案時如何水平列印?
