4

Pythonのリスト内の連続するゼロの実行ごとに、それらxを除く実行中のすべてのゼロを削除したいと思いxます。の場合x = 0、すべてゼロを削除します。

Lリストと数値xを入力として受け取るPython関数を考えていました。

たとえば、L = [7, 0, 12, 0, 0, 2, 0, 0, 0, 27, 10, 0, 0, 0, 0, 8]

  • の場合x = 0L = [7, 12, 2, 27, 10, 8]
  • の場合x = 1L = [7, 0, 12, 0, 2, 0, 27, 10, 0, 8]
  • の場合x = 2L = [7, 0, 12, 0, 0, 2, 0, 0, 27, 10, 0, 0, 8]
  • の場合x = 3L = [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、5つ以上の連続するゼロの実行がないため、元のLを返します。

どんな助けでも心から感謝します。

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 に答える