1

仮定する

x = range(20)
k = 5
x_kth = x[::5]

それは私に与えます0,5,10,15 etc x の非 k 番目の要素を取得する簡単な方法はありますか?

x_nonkth = [1,2,3,4,6,7,8,9,11 etc

私は私ができることを知っています

x_nonkth = [x[i] for i in range(len(x)) if i%k]

しかし、もしあれば、もっと簡単な方法(そしておそらくもっと速い?)を探しています。

4

3 に答える 3

1

を使用すると、もう少し Pythonic になれますenumerate。それとは別に、そのリスト内包表記は、ほとんどあなたが望むものの定義です:

>>> lst = range(20)
>>> [e for i, e in enumerate(lst) if i % 5]
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19]

別のアプローチは、スライスを取得してそれらをチェーンすることですが、それは簡単ではないと思います ( がk大きく、リストが長い場合は高速になる可能性があります)。

from itertools import islice, chain

def without_kth(lst, k):
    return list(chain.from_iterable(
        islice(lst, i+1, i+k) for i in range(0, len(lst), k)
    ))
于 2012-12-02T19:05:15.410 に答える
1

を使用del x[::5]して、リスト内の要素を 5 つおきに削除できます。元のリストを変更するため、新しいリストが必要な場合は、最初にリストをコピーしてから変更を使用してください。

>>> y = x[:]
>>> del y[::5]
>>> print y
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19]
于 2012-12-02T20:01:50.383 に答える
1

あなたは違いを利用することができますset: -

>>> x = range(20)
>>> k = 5
>>> list(set(x) - set(x[::k]))
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19]
于 2012-12-02T18:50:56.100 に答える