Res*_*per 3 python numpy pandas python-3.6
我有包含None如下列表的列表。
l1 = [None, 1, None, None, 2, None, None]
l2 = [None, 1, 1, None, None, None, 2, None, None]
Run Code Online (Sandbox Code Playgroud)
我想None在此列表中获得第一个位置,该位置给出最大的连续 None计数。
get_start_None_pos(l1) # should return 2
get_start_None_pos(l2) # should return 3
Run Code Online (Sandbox Code Playgroud)
我目前使用Pandas的方法效果很好,但是当我要处理的列表太多时,速度太慢。
def get_start_None_pos(l: list) -> int:
s = pd.Series(l)
s = s.isna()
s = s.cumsum() - s.cumsum().where(~s).ffill().fillna(0)
return int(s.idxmax() - s.max() + 1)
Run Code Online (Sandbox Code Playgroud)
我想知道,有没有更好的办法来解决这样的问题?
这是NumPy的一个-
def maxconsecNone_start(l):
a = np.isnan(np.asarray(l, dtype=np.float64))
a1 = np.r_[False,a,False]
idx = np.flatnonzero(a1[:-1] != a1[1:])
return idx[2*(idx[1::2]-idx[::2]).argmax()]
Run Code Online (Sandbox Code Playgroud)
样品运行-
In [49]: l1
Out[49]: [None, 1, None, None, 2, None, None]
In [50]: l2
Out[50]: [None, 1, 1, None, None, None, 2, None, None]
In [51]: maxconsecNone_start(l1)
Out[51]: 2
In [52]: maxconsecNone_start(l2)
Out[52]: 3
Run Code Online (Sandbox Code Playgroud)