14

Pythonのリストから、最初の要素、3番目から200番目の要素、および201番目の要素から最後の要素までのステップサイズ3が必要だとします。

これを行う1つの方法は、個別のインデックス付けと連結を使用することです。

new_list = old_list[0:1] + old_list[3:201] + old_list[201::3]

1つのインデックスだけでこれを行う方法はありold_listますか?私は次のようなものが欲しいです(リストインデックスはリストにすることができず、Pythonには残念ながらスライスリテラルがないため、これは構文的に機能しないことを知っています;私はちょうど近いものを探しています):

new_list = old_list[[0, 3:201, 201::3]]

NumPy配列に切り替えることでこれのいくつかを達成できますが、ネイティブPythonリストに対してそれを行う方法にもっと興味があります。また、スライスメーカーなどを作成することもできます。また、必要なすべてのスライスの構成を表す同等のスライスオブジェクトを提供する強力なアームを作成することもできます。

しかし、私はスライスを管理するための新しいクラスを作成することを含まない何かを探しています。スライス構文を連結してリストにフィードし、スライスを個別に取得してそれぞれの結果を最終的に連結することを意味することをリストに理解させたいと思います。

4

6 に答える 6

7

スライスメーカーオブジェクト(たとえばSliceMaker、他の質問から、またはnp.s_)は、複数のコンマ区切りのスライスを受け入れることができます。それらは、sまたは他のオブジェクトとして受信されtupleますslice

from numpy import s_
s_[0, 3:5, 6::3]
Out[1]: (0, slice(3, 5, None), slice(6, None, 3))

NumPyはこれを多次元配列に使用しますが、スライスの連結に使用できます。

def xslice(arr, slices):
    if isinstance(slices, tuple):
        return sum((arr[s] if isinstance(s, slice) else [arr[s]] for s in slices), [])
    elif isinstance(slices, slice):
        return arr[slices]
    else:
        return [arr[slices]]
xslice(list(range(10)), s_[0, 3:5, 6::3])
Out[1]: [0, 3, 4, 6, 9]
xslice(list(range(10)), s_[1])
Out[2]: [1]
xslice(list(range(10)), s_[:])
Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
于 2013-03-01T17:04:18.343 に答える
1

おそらく、独自のシーケンスタイプを作成する方がよいでしょう。

>>> L = range(20)
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> operator.itemgetter(*(range(1, 5) + range(10, 18, 3)))(L)
(1, 2, 3, 4, 10, 13, 16)

そして、それを始めるために:

>>> operator.itemgetter(*(range(*slice(1, 5).indices(len(L))) + range(*slice(10, 18, 3).indices(len(L)))))(L)
(1, 2, 3, 4, 10, 13, 16)
于 2012-12-12T14:52:18.613 に答える
0

目的に合わせてカスタム スライスを作成しない理由

>>> from itertools import chain, islice
>>> it = range(50)
>>> def cslice(iterable, *selectors):
    return chain(*(islice(iterable,*s) for s in selectors))

>>> list(cslice(it,(1,5),(10,15),(25,None,3)))
[1, 2, 3, 4, 10, 11, 12, 13, 14, 25, 28, 31, 34, 37, 40, 43, 46, 49]
于 2012-12-12T15:32:03.703 に答える