对于每一个运行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个或更多连续零的运行。
任何帮助将衷心感谢。
这是很容易做到的发电机。 包装你调用它在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
使用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]]
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?