這是一個純粹的Python解決方案。
創建一個保留先前值狀態的小類,並將當前值與此先前值進行比較。
class Checker:
def _compare(self, val):
if val or not self.prior:
self.prior = val
return val
return self.prior
def reverse_fill_list(self, some_list):
self.prior = None
return [self._compare(v) for v in some_list[::-1]][::-1]
然後以相反的順序在列表中使用列表理解(使用[:: - 1]來反轉)。然後再次反轉結果以恢復原始訂單。
some_list = [1, 0, 0, -1, 0, 1, 0, 0, 0, -1]
c = Checker() # Instantiate object.
>>> c.reverse_fill_list(some_list)
[1, -1, -1, -1, 1, 1, -1, -1, -1, -1]
np.random.seed(0)
# Create one million values in range [-1, 0, 1].
a = np.random.random_integers(-1, 1, 1000000)
>>> a[:10]
array([-1, 0, -1, 0, 0, 1, -1, 1, -1, -1])
%timeit c.reverse_fill_list(a)
1 loops, best of 3: 311 ms per loop
使用熊貓(使用@Jezrael解決方案)的結果更快。
>>> pd.Series(a).replace({0:np.nan}).fillna(method='bfill').tolist()
10 loops, best of 3: 136 ms per loop
你是否需要內存中的整個輸出列表,或者生成器方法可以嗎?你用什麼做下游? – tzaman