我想創建一個函式,將串列(或 numpy 陣列)A 和數字 L 作為輸入。A 充滿了 0 和 1,目標是在長度超過 L 時保留 1 的子序列。我寫了一個函式來修復(A,L),但是運行需要很長時間,所以我想知道它們是否是一種更快的方法。
def fix(A,L):
i=0
while True:
if i==len(A):
return(A)
if A[i]==1:
s=0
for j in range(i,len(A)):
if A[j]==1:
s =1
continue
else:
if s>=L:
break
else:
A[i:j]=[0]*len(A[i:j])
break
if A[j]==1 and s<L:
A[i:j 1]=[0]*len(A[i:j 1])
i=j 1
else:
i =1
continue
如果我稱它為正確答案,fix([1,0,0,1,1,1,0,1,1,1,1,0,1,1,0,1], 3)則回傳。[0,0,0,1,1,1,0,1,1,1,1,0,0,0,0,0]
uj5u.com熱心網友回復:
如果您正在使用 2D numpy 陣列,則可以使用二進制腐蝕和膨脹來實作您想要實作的目標。我們可以使用
? 
uj5u.com熱心網友回復:
您可以使用itertools.groupby和itertools.chain:
def fix(A, L):
from itertools import groupby, chain
return list(chain.from_iterable(l if ((len(l:=list(g)) >= L and k) or not k) else [0]*len(l)
for k, g in groupby(A)))
fix([1,0,0,1,1,1,0,1,1,1,1,0,1,1,0,1], 3)
# [0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0]
怎么運行的
groupby(A)將按連續的 0 或 1 分組。對于每個組,我們獲取長度并檢查這是一組 1 還是 0。如果長度 ≥ L 的 0 組或 1 組,我們保留它,否則我們用相同長度的 0 組替換。最后,我們chain把所有東西組成一個連續的串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410490.html
標籤:
下一篇:在Python中,我想為串列中的每個元素添加一個數字,但我得到的是[[0,1],2]而不是[0,1,2]。如何解決這個問題?
