-->

如何删除全部为零,除了在列表中连续零的每次运行他们的X?(How can I delete all

2019-09-20 11:50发布

对于每一个运行x Python中的列表或多个连续的零,我想删除运行中所有零除x人。 如果x = 0 ,则删除全部为零。

我的想法是把一个列表,一个Python函数的L ,和一个数字, x ,作为输入。

例如,让L = [7, 0, 12, 0, 0, 2, 0, 0, 0, 27, 10, 0, 0, 0, 0, 8]

  • 如果x = 0 ,则返回L = [7, 12, 2, 27, 10, 8]
  • 如果x = 1 ,然后返回L = [7, 0, 12, 0, 2, 0, 27, 10, 0, 8]
  • 如果x = 2 ,则返回L = [7, 0, 12, 0, 0, 2, 0, 0, 27, 10, 0, 0, 8]
  • 如果x = 3 ,则返回L = [7, 0, 12, 0, 0, 2, 0, 0, 0, 27, 10, 0, 0, 0, 8]
  • 如果x = 4 ,则返回L = [7, 0, 12, 0, 0, 2, 0, 0, 0, 27, 10, 0, 0, 0, 0, 8]同原始L
  • 如果x >= 5 ,再返回原始L,以不存在5个或更多连续零的运行。

任何帮助将衷心感谢。

Answer 1:

这是很容易做到的发电机。 包装你调用它在list ,如果你想有一个新的列表与删除零运行构造。

def compact_zero_runs(iterable, max_zeros):
    zeros = 0
    for i in iterable:
        if i == 0:
            zeros += 1
            if zeros <= max_zeros:
                yield i
        else:
            zeros = 0
            yield i


Answer 2:

使用GROUPBY:

def del_zeros(lst, n):
    lst = (list(j)[:n] if i else list(j) 
           for i,j in itertools.groupby(lst, key=lambda x:x==0))

    return [item for sublist in lst for item in sublist]

而测试:

>>> [del_zeros(L, i) for i in range(5)]
[[7, 12, 2, 27, 10, 8],
 [7, 0, 12, 0, 2, 0, 27, 10, 0, 8],
 [7, 0, 12, 0, 0, 2, 0, 0, 27, 10, 0, 0, 8],
 [7, 0, 12, 0, 0, 2, 0, 0, 0, 27, 10, 0, 0, 0, 8],
 [7, 0, 12, 0, 0, 2, 0, 0, 0, 27, 10, 0, 0, 0, 0, 8]]


Answer 3:

from itertools import groupby, chain, islice
from functools import partial
from operator import eq

def f(L, x):
    groups = groupby(L, partial(eq, 0))
    return list(chain.from_iterable(islice(v, x) if k else v for k,v in groups))


文章来源: How can I delete all zeros except for x of them in every run of consecutive zeros within a list?
标签: python list del