仮定する
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]
しかし、もしあれば、もっと簡単な方法(そしておそらくもっと速い?)を探しています。
を使用すると、もう少し 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)
))
を使用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]
あなたは違いを利用することができます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]