我有一個有序串列,例如:
my_list = [0.1, 0.2, 0.3, 0.4, 2.6, 2.7, 2.8, 2.9,
5.1, 5.2, 6.1, 6.2, 6.3, 7.1, 7.2, 7.3,
7.4, 7.5, 10.1, 10.2, 10.3, 10.4, 10.5]
我需要間隔 <1s 的數字間隔,其中至少有 3 個數字。我只想要間隔的開始和結束。例如:
Output: [[0.1, 0.4], [2.6, 2.9], [5.1, 7.5], [10.1, 10.5]]
或者
In[0]: print(start)
Output: [0.1, 2.6, 5.1, 10.1]
In[1]: print(end)
Output: [0.4, 2.9, 7.5, 10.5]
我已經嘗試了各種回圈,但是我無法僅將開始時間附加到新串列中,并且在到達串列末尾時也無法避免“索引超出范圍”。這是我目前所在的位置:
for i in range(0, (len(my_list)-2)):
second = i 1
third = i 2
if ((my_list[third] - my_list[second])) < 1 and ((my_list[second] - my_list[i]) < 1):
temp.append(my_list[i])
else:
end.append(my_list[second])
start.append(temp[0])
temp.clear()
我只獲取間隔開始的解決方案是將專案附加到臨時串列,附加第一個和最后一個元素并清除該串列。我確信有一種更優雅的方法可以做到這一點,并且串列可以有數千行,所以我認為這不是一種非常有效的方法。
任何幫助將非常感激。
uj5u.com熱心網友回復:
這是另一種方法:numpy list comprehension:
import numpy as np
out = [[arr[0], arr[-1]] for arr in np.split(my_list, np.where(np.diff(my_list) > 1)[0] 1) if len(arr)>2]
或者,如果您不想使用 numpy,則可以使用 2 個串列推導式來查找相同的內容:
splits = [0] [idx 1 for idx, (i,j) in enumerate(zip(my_list, my_list[1:])) if j-i > 1] [len(my_list)]
out = [[my_list[start], my_list[end-1]] for start, end in zip(splits, splits[1:]) if end - start > 2]
輸出:
[[0.1, 0.4], [2.6, 2.9], [5.1, 7.5], [10.1, 10.5]]
uj5u.com熱心網友回復:
使用熊貓:
arr = pd.Series(my_list)
arr = arr.groupby(arr.astype(int)).nth([0,-1])
result = arr.values.reshape([arr.size//2,2])
或者沒有熊貓,您可以itertools.groupby將其int用作您的密鑰:(注意:這假設串列已排序)
from itertools import groupby
result = []
for k, g in groupby(my_list, int):
group = list(g)
result.append([group[0], group[-1]])
或者作為一種理解:
result = [[f:=next(g), [f, *g][-1]] for k, g in groupby(my_list, int)]
uj5u.com熱心網友回復:
這是一種方法:
start = my_list[:1] [z[0] for z in zip(my_list[0:-1],my_list[1:]) if z[0] 1<z[1]]
end = [z[1] for z in zip(my_list[0:-1],my_list[1:]) if z[0] 1<z[1]] my_list[-1:]
uj5u.com熱心網友回復:
您可以使用堆疊來跟蹤條件后的所有值,一旦新值出現,然后清空堆疊,檢查它的長度是否大于 2,如果是,則將堆疊中的第一個和最后一個元素添加到結果串列中。
這是另一種方式:
my_list = [0.1, 0.2, 0.3, 0.4, 2.6, 2.7, 2.8, 2.9,
5.1, 5.2, 6.1, 6.2, 6.3, 7.1, 7.2, 7.3,
7.4, 7.5, 10.1, 10.2, 10.3, 10.4, 10.5]
result = []
tmp =[]
for i, v in enumerate(my_list):
if not tmp:
tmp.append(v)
else:
if abs(tmp[-1]-v)<1:
tmp.append(v)
else:
if len(tmp)>=3:
result.append([tmp[0], tmp[-1]])
tmp = [v]
if tmp and len(tmp)>=3:
result.append([tmp[0], tmp[-1]])
print(result)
# output: [[0.1, 0.4], [2.6, 2.9], [5.1, 7.5], [10.1, 10.5]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/388190.html
上一篇:R-使用回圈創建多個變數
