gpt4 book ai didi

python - 替换序列中的 1's with 0'

转载 作者:太空狗 更新时间:2023-10-30 00:24:46 27 4
gpt4 key购买 nike

我有一大堆像这样的 1 和 0 的列表:

x = [1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1].  

完整列表 here .

我想创建一个新列表 y,条件是,只有当 1 出现在 >= than 10 的序列中时,才应保留 1,否则应将这些 1 替换为零。
ex 基于上面的 x ^ ,y 应该变成:

y = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1].  

到目前为止,我有以下内容:

  1. 找出发生变化的地方
  2. 找出以何种频率出现的序列:

import numpy as np
import itertools
nx = np.array(x)
print np.argwhere(np.diff(nx)).squeeze()

answer = []
for key, iter in itertools.groupby(nx):
answer.append((key, len(list(iter))))
print answer

这给了我:

[0 3 8 14]  # A
[(1, 1), (0, 3), (1, 5), (0, 6), (1, 10)] # B

#A 这意味着更改发生在第 0、3 等位置之后。

#B 表示有一个 1,后面跟着三个 0,接着是五个 1,接着是 6 个零,最后是 10 个 1。

我如何继续创建 y 的最后一步,我们将根据序列长度用 0 替换 1?

PS:##我对来自所有杰出人士的出色解决方案感到谦卑。

最佳答案

只需在迭代分组依据时进行检查。像这样的东西:

>>> from itertools import groupby
>>> x = [1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1]
>>> result = []
>>> for k, g in groupby(x):
... if k:
... g = list(g)
... if len(g) < 10:
... g = len(g)*[0]
... result.extend(g)
...
>>> result
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

请注意,至少对于这种大小的数据集,这比相应的 pandas 解决方案更快:

In [11]: from itertools import groupby

In [12]: %%timeit
...: result = []
...: for k, g in groupby(x):
...: if k:
...: g = list(g)
...: if len(g) < 10:
...: g = len(g)*[0]
...: result.extend(g)
...:
181 µs ± 1.72 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [13]: %%timeit s = pd.Series(x)
...: s[s.groupby(s.ne(1).cumsum()).transform('count').lt(10)] = 0
...:
4.03 ms ± 176 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

请注意,这是对 pandas 解决方案的慷慨,不计算从列表转换为 pd.Series 或转换回来的任何时间,包括那些:

In [14]: %%timeit
...: s = pd.Series(x)
...: s[s.groupby(s.ne(1).cumsum()).transform('count').lt(10)] = 0
...: s = s.tolist()
...:
4.92 ms ± 119 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关于python - 替换序列中的 1's with 0',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49139764/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com