【问题标题】:Replace duplicates of block size less than Threshold - Python替换块大小小于阈值的重复项 - Python
【发布时间】:2018-06-07 07:30:09
【问题描述】:

如何从 python 中这样的列表中删除块大小小于某个阈值(此处为 4)的连续重复项?

L = [0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0, 0,1,1,0,0,0,0,0,1,1,0,0,0,0]

我希望结果是这样的:

O = [0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0]

新列表还应将块大小小于阈值(此处为 4)的连续重复块替换为邻居值(如填充邻居)。

我在想一些平滑过滤器之王,但找不到。另外,我正在考虑为此编写原始代码,但无法思考逻辑。

假设它是二进制列表。

【问题讨论】:

  • 提示:itertools.groupby.
  • 阈值为 4 的 [0,0,0,1,1,0,0,1,1,1,0] 的输出是什么?
  • @Piinthesky 我认为如果初始块大小本身不是大小阈值,这并不复杂。我用 itertools.groupby 解决了我的问题。

标签: python


【解决方案1】:

正如@cᴏʟᴅsᴘᴇᴇᴅ 所说,您可以使用itertools.groupby 来实现您想要的。

from itertools import groupby

L = [0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0]
ans = []

for (i,j) in groupby(L):
    a = list(j)
    if len(a)<4: # replace with threshold
        ans = ans + [1-i]*len(a) # not of a binary value i = 1-i
    else:
        ans = ans + a
print(ans)

输出:

[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

【讨论】:

  • 如果可能的话,我会感谢 cmets 让代码变得更好。
  • 是的.. 我已经用 COLDSPEED 建议的 itertools.groupby 解决了这个问题。
  • 感谢 Miraj50 的回答。
猜你喜欢
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多