4

对于 Python 中列表中的每次x或多个连续零的运行,我想删除运行中的所有零,但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 个或更多连续零的运行。

任何帮助将不胜感激。

4

3 回答 3

8

作为生成器,这很容易做到。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
于 2012-07-31T03:17:58.527 回答
3

使用 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]]
于 2012-07-31T03:16:35.370 回答
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))
于 2012-07-31T03:20:57.090 回答