8

次のようなリストがあります。

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

次のようなフィルタリングされたリストを生成したいと思います。

filtered_lst = [2, 6, 7, 9, 10, 13]

Python はカスタム スライスの規約を提供していますか。次のようなもの:

lst[1, 5, 6, 8, 9, 12] # slice a list by index
4

5 に答える 5

16

使用operator.itemgetter():

from operator import itemgetter

itemgetter(1, 5, 6, 8, 9, 12)(lst)

デモ:

>>> from operator import itemgetter
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
>>> itemgetter(1, 5, 6, 8, 9, 12)(lst)
(2, 6, 7, 9, 10, 13)

これはタプルを返します。list(itemgetter(...)(lst))要件である ifを使用してリストにキャストします。

これはlst[start:stop]、範囲の代わりに一連のインデックスを使用したスライス式 ( ) と同等であることに注意してください。左側のスライス割り当て ( lst[start:stop] = some_iterable) としては使用できません。

于 2013-01-01T22:01:20.657 に答える
5

Numpy 配列には、この種のスライス構文があります。

In [45]: import numpy as np

In [46]: lst = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])

In [47]: lst[[1, 5, 6, 8, 9, 12]]
Out[47]: array([ 2,  6,  7,  9, 10, 13])
于 2013-01-01T22:08:13.627 に答える
1

リスト内包表記を使用すると、簡単かつ簡単に実行できます。

lst = range(1, 14)
indices = [1, 5, 6, 8, 9, 12]
filtered_lst = [lst[i] for i in indices]
于 2013-01-01T22:20:47.133 に答える
1

operator.itemgetter()Martijn Pieters が提案した方法を使用しますが、別の方法を次に示します (完全を期すため)。

In [23]: lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

In [24]: indices = set([1, 5, 6, 8, 9, 12])

In [25]: [n for i,n in enumerate(lst) if i in indices]
Out[25]: [2, 6, 7, 9, 10, 13]
于 2013-01-01T22:05:58.950 に答える
0

Python スライスを使用すると、スライスを割り当てのターゲットにすることができます。また、Python のスライシング構文では、インデックスのパターンが不規則なスライスは許可されません。そのため、「カスタム」スライスを割り当てのターゲットにしたい場合、Python スライス構文ではそれができません。

指定された要素のコピーを取得することで要件が満たされている場合operator.itemgetter()は、ニーズを満たしています。スライスの割り当てが必要な場合は、numpy スライスが適しています。

于 2013-01-01T22:12:23.270 に答える