我有一個由 android 應用程式生成的坐標串列。我想要的是每次找到元素 (0.0,0.0) 時自動將串列拆分到另一個串列中,當它找到下一個 (0.0,0.0) 時,它會將其拆分到另一個串列中,依此類推。元素的數量 (0.0,0.0) 取決于我運行應用程式的次數,因此在示例中,我運行了應用程式 3 次,但如果我運行了 4 次,則需要將 big_list 拆分為 4 個串列。這樣,big_list 的大小和決定拆分次數的 (0.0,0.0) 元素的數量取決于我在從資料庫匯出檔案并將其加載到 python 上進行分析之前運行應用程式的次數.
這是示例:
big_list = [**(0.0, 0.0)**, (0.7061503529548645, -0.5579889416694641), (1.412300705909729, -1.1159778833389282), (2.1184511184692383, -1.673966884613037), (2.824601411819458, -2.2319557666778564), **(0.0, 0.0)**, (0.6936703324317932, -0.573429524898529), (1.3873406648635864, -1.146859049797058), (2.0810110569000244, -1.7202885150909424), (2.7677958011627197, -2.3019471168518066), **(0.0, 0.0)**, (0.6973708868026733, -0.5689234137535095), (1.3947417736053467, -1.137846827507019), (2.0921125411987305, -1.7067701816558838), (2.7894835472106934, -2.275693655014038), (3.4868545532226562, -2.8446171283721924), (4.184225559234619, -3.4135406017303467)]
我想要的是從元素 (0.0,0.0) 和以下元素開始的 3 個串列,直到找到下一個 (0.0,0.0) 再次拆分:
list1 = [(0.0, 0.0), (0.7061503529548645, -0.5579889416694641), (1.412300705909729, -1.1159778833389282), (2.1184511184692383, -1.673966884613037), (2.824601411819458, -2.2319557666778564)]
list2= [(0.0, 0.0), (0.6936703324317932, -0.573429524898529), (1.3873406648635864, -1.146859049797058), (2.0810110569000244, -1.7202885150909424), (2.7677958011627197, -2.3019471168518066)]
list3 = [(0.0, 0.0), (0.6973708868026733, -0.5689234137535095), (1.3947417736053467, -1.137846827507019), (2.0921125411987305, -1.7067701816558838), (2.7894835472106934, -2.275693655014038), (3.4868545532226562, -2.8446171283721924), (4.184225559234619, -3.4135406017303467)]
uj5u.com熱心網友回復:
這種方法會給你一個你需要的答案
def split_list(input_list:list) -> list:
start_ind=0
result = []
for ind, x in enumerate(input_list):
if ( x == (0.0, 0.0) or ind == len(input_list)-1 ) and ind != 0:
result.append(input_list[start_ind:ind])
start_ind=ind
return result
uj5u.com熱心網友回復:
我同意@conol 的回答,但您可以添加這個額外的步驟并獲得您想要的結果。
基本上,我們在您撰寫的分隔符上拆分串列,然后我們正在使用代碼更新區域設定,以便您在運行時獲得動態創建的變數
def split_list(input_list:list) -> list:
start_ind=0
dict = {}
varname= 'list'
counter = 0
for ind, x in enumerate(input_list):
if ( x == (0.0, 0.0) or ind == len(input_list)-1 ) and ind != 0:
dict[varname str(counter)] = input_list[start_ind:ind]
start_ind=ind
counter =1
return dict
locals().update(split_list(a))
print(list0,list1,list2)
uj5u.com熱心網友回復:
例如,可以定義一個函式來遍歷大串列的條目并創建子串列(帶有型別注釋):
from pprint import pprint
from typing import List, Optional, Tuple
def split_big_list(
big_list: List[Tuple[float, float]],
) -> List[List[Tuple[float, float]]]:
result: List[List[Tuple[float, float]]] = []
current_list: Optional[List[Tuple[float, float]]] = None
for entry in big_list:
if entry == (0.0, 0.0):
current_list = [entry]
result.append(current_list)
elif current_list is None:
# ignore entries before first tuple with zeros
continue
else:
current_list.append(entry)
return result
BIG_LIST = [(0.0, 0.0), (0.7061503529548645, -0.5579889416694641), (1.412300705909729, -1.1159778833389282), (2.1184511184692383, -1.673966884613037), (2.824601411819458, -2.2319557666778564), (0.0, 0.0), (0.6936703324317932, -0.573429524898529), (1.3873406648635864, -1.146859049797058), (2.0810110569000244, -1.7202885150909424), (2.7677958011627197, -2.3019471168518066), (0.0, 0.0), (0.6973708868026733, -0.5689234137535095), (1.3947417736053467, -1.137846827507019), (2.0921125411987305, -1.7067701816558838), (2.7894835472106934, -2.275693655014038), (3.4868545532226562, -2.8446171283721924), (4.184225559234619, -3.4135406017303467)]
lists = split_big_list(BIG_LIST)
pprint(lists)
結果:
[[(0.0, 0.0),
(0.7061503529548645, -0.5579889416694641),
(1.412300705909729, -1.1159778833389282),
(2.1184511184692383, -1.673966884613037),
(2.824601411819458, -2.2319557666778564)],
[(0.0, 0.0),
(0.6936703324317932, -0.573429524898529),
(1.3873406648635864, -1.146859049797058),
(2.0810110569000244, -1.7202885150909424),
(2.7677958011627197, -2.3019471168518066)],
[(0.0, 0.0),
(0.6973708868026733, -0.5689234137535095),
(1.3947417736053467, -1.137846827507019),
(2.0921125411987305, -1.7067701816558838),
(2.7894835472106934, -2.275693655014038),
(3.4868545532226562, -2.8446171283721924),
(4.184225559234619, -3.4135406017303467)]]
uj5u.com熱心網友回復:
使用 enumerate 查找 (0,0) 項的索引。然后 zip() 將它們與 teir 后繼者配對以形成子范圍:
starts = [i for i,v in enumerate(big_list) if v == (0,0)]
sublists = [big_list[s:e] for s,e in zip(starts,starts[1:] [None])]
print(sublists)
[[(0.0, 0.0), (0.7061503529548645, -0.5579889416694641), (1.412300705909729, -1.1159778833389282), (2.1184511184692383, -1.673966884613037), (2.824601411819458, -2.2319557666778564)],
[(0.0, 0.0), (0.6936703324317932, -0.573429524898529), (1.3873406648635864, -1.146859049797058), (2.0810110569000244, -1.7202885150909424), (2.7677958011627197, -2.3019471168518066)],
[(0.0, 0.0), (0.6973708868026733, -0.5689234137535095), (1.3947417736053467, -1.137846827507019), (2.0921125411987305, -1.7067701816558838), (2.7894835472106934, -2.275693655014038), (3.4868545532226562, -2.8446171283721924), (4.184225559234619, -3.4135406017303467)]]
# if you want them in variables
# (but then you need to know how many subslits there are ahead of time):
lst1,lst2,lst3 = sublists
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368109.html
