Python Language
インデックス作成とスライス
サーチ…
構文
- obj [開始:停止:ステップ]
- スライス(停止)
- スライス(開始、停止[、ステップ])
パラメーター
パラマー | 説明 |
---|---|
obj | 「サブオブジェクト」を抽出するオブジェクト |
start | サブオブジェクトを開始するobj のインデックス(Pythonはゼロインデックスされていることに注意してください。つまり、 obj の最初のアイテムにはインデックスが0 )。省略した場合のデフォルトは0 です。 |
stop | サブオブジェクトを終了させるobj の(非包含的な)インデックス。省略すると、デフォルトはlen(obj) ます。 |
step | すべてのstep 項目のみを選択できます。省略すると、デフォルトは1 ます。 |
備考
ユニコード文字が長さ1の文字列で表されていることを注意して、文字列を不変の文字集合として表示することによって、文字列をスライスする概念を他のシーケンスをスライスする概念と統一することができます。
数学的表記法では、 [start, end)
半開きの間隔を使用するようスライスすることが考えられます。つまり、開始が含まれていますが、終わりはありません。間隔の半分オープンな性質は、その利点有するlen(x[:n])
= n
ここで、 len(x)
> = n
、開始時に閉じられている間隔は利点有しながらx[n:n+1]
= [x[n]]
ここで、 x
はlen(x) >= n
リストであるため、索引付けとスライス表記の一貫性が保たれます。
基本スライス
任意の反復可能(例えば、文字列、リストなど)の場合、Pythonではデータの部分文字列または部分リストをスライスして返すことができます。
スライシングのフォーマット:
iterable_name[start:stop:step]
ここで、
-
start
はスライスの最初のインデックスです。デフォルトは0(最初の要素のインデックス) - スライスの最後のインデックスを1つ
stop
します。デフォルトはlen(iterable)です。 -
step
はステップサイズです(下記の例でより詳しく説明しています)
例:
a = "abcdef"
a # "abcdef"
# Same as a[:] or a[::] since it uses the defaults for all three indices
a[-1] # "f"
a[:] # "abcdef"
a[::] # "abcdef"
a[3:] # "def" (from index 3, to end(defaults to size of iterable))
a[:4] # "abcd" (from beginning(default 0) to position 4 (excluded))
a[2:4] # "cd" (from position 2, to position 4 (excluded))
さらに、上記のいずれかを定義されたステップサイズで使用することができます。
a[::2] # "ace" (every 2nd element)
a[1:4:2] # "bd" (from index 1, to index 4 (excluded), every 2nd element)
インデックスは負の値にすることができます。この場合、インデックスはシーケンスの最後から計算されます
a[:-1] # "abcde" (from index 0 (default), to the second last element (last element - 1))
a[:-2] # "abcd" (from index 0 (default), to the third last element (last element -2))
a[-1:] # "f" (from the last element to the end (default len())
ステップサイズは負の値にすることもできます。この場合、スライスはリストを逆順に繰り返します。
a[3:1:-1] # "dc" (from index 2 to None (default), in reverse order)
この構造体は、反復可能な
a[::-1] # "fedcba" (from last element (default len()-1), to first, in reverse order(-1))
負のステップでは、デフォルトのend_index
はNone
( http://stackoverflow.com/a/12521981参照 )であることに注意してください。
a[5:None:-1] # "fedcba" (this is equivalent to a[::-1])
a[5:0:-1] # "fedcb" (from the last element (index 5) to second element (index 1)
配列の浅いコピーを作る
配列のコピーを作成する簡単な方法は、(元の配列に別の参照で変数を代入するのではなく)です:
arr[:]
構文を調べてみましょう。 [:]
は、 start
、 end
、およびslice
がすべて省略されていることを意味しslice
。それらはデフォルトで0
、 len(arr)
、 1
とそれぞれ指定されています。つまり、要求している部分配列には、最初から最後までarr
すべての要素があります。
実際には、これは次のようになります。
arr = ['a', 'b', 'c']
copy = arr[:]
arr.append('d')
print(arr) # ['a', 'b', 'c', 'd']
print(copy) # ['a', 'b', 'c']
ご覧のとおり、 arr.append('d')
はarr
にd
を追加しましたが、 copy
は変更されませんでした。
これは、 浅いコピーを作成し、 arr.copy()
と同じであることに注意してください。
オブジェクトの逆転
スライスを使用すると、 str
、 list
、またはtuple
(または基本的にはstepパラメータでスライスを実装する任意のコレクションオブジェクト)を簡単に逆にすることができます。上記の他の型にも同じことが当てはまりますが、文字列を逆転させる例を以下に示します:
s = 'reverse me!'
s[::-1] # '!em esrever'
すぐに構文を見てみましょう。 [::-1]
は、スライスが文字列の最初から最後までであることを意味します( start
とend
が省略されているため) -1
場合は、文字列を逆に移動する必要があります。
カスタムクラスのインデックス作成:__getitem__、__setitem__、__delitem__
class MultiIndexingList:
def __init__(self, value):
self.value = value
def __repr__(self):
return repr(self.value)
def __getitem__(self, item):
if isinstance(item, (int, slice)):
return self.__class__(self.value[item])
return [self.value[i] for i in item]
def __setitem__(self, item, value):
if isinstance(item, int):
self.value[item] = value
elif isinstance(item, slice):
raise ValueError('Cannot interpret slice with multiindexing')
else:
for i in item:
if isinstance(i, slice):
raise ValueError('Cannot interpret slice with multiindexing')
self.value[i] = value
def __delitem__(self, item):
if isinstance(item, int):
del self.value[item]
elif isinstance(item, slice):
del self.value[item]
else:
if any(isinstance(elem, slice) for elem in item):
raise ValueError('Cannot interpret slice with multiindexing')
item = sorted(item, reverse=True)
for elem in item:
del self.value[elem]
これにより、要素アクセスのスライスとインデックス作成が可能になります。
a = MultiIndexingList([1,2,3,4,5,6,7,8])
a
# Out: [1, 2, 3, 4, 5, 6, 7, 8]
a[1,5,2,6,1]
# Out: [2, 6, 3, 7, 2]
a[4, 1, 5:, 2, ::2]
# Out: [5, 2, [6, 7, 8], 3, [1, 3, 5, 7]]
# 4|1-|----50:---|2-|-----::2----- <-- indicated which element came from which index
要素の設定と削除では、 カンマ区切り整数インデクシング(スライスなし)のみが可能です。
a[4] = 1000
a
# Out: [1, 2, 3, 4, 1000, 6, 7, 8]
a[2,6,1] = 100
a
# Out: [1, 100, 100, 4, 1000, 6, 100, 8]
del a[5]
a
# Out: [1, 100, 100, 4, 1000, 100, 8]
del a[4,2,5]
a
# Out: [1, 100, 4, 8]
スライスの割り当て
スライスを使用する別のきれいな機能は、スライスの割り当てです。 Pythonでは、新しいスライスを割り当てて、リストの古いスライスを1回の操作で置き換えることができます。
つまり、リストがある場合は、1つの割り当てで複数のメンバーを置き換えることができます。
lst = [1, 2, 3]
lst[1:3] = [4, 5]
print(lst) # Out: [1, 4, 5]
割り当てがサイズにも一致しないようにする必要があります。古いスライスをサイズの異なる新しいスライスに置き換える場合は、次のようにします。
lst = [1, 2, 3, 4, 5]
lst[1:4] = [6]
print(lst) # Out: [1, 6, 5]
また、既知のスライシング構文を使用して、リスト全体を置き換えるなどの作業を行うこともできます。
lst = [1, 2, 3]
lst[:] = [4, 5, 6]
print(lst) # Out: [4, 5, 6]
または、最後の2人だけ:
lst = [1, 2, 3]
lst[-2:] = [4, 5, 6]
print(lst) # Out: [1, 4, 5, 6]
スライスオブジェクト
スライスはそれ自身のオブジェクトであり、組み込みのslice()
関数を使用して変数に格納することができます。スライス変数は、コードを読みやすくして再利用を促進するために使用できます。
>>> programmer_1 = [ 1956, 'Guido', 'van Rossum', 'Python', 'Netherlands']
>>> programmer_2 = [ 1815, 'Ada', 'Lovelace', 'Analytical Engine', 'England']
>>> name_columns = slice(1, 3)
>>> programmer_1[name_columns]
['Guido', 'van Rossum']
>>> programmer_2[name_columns]
['Ada', 'Lovelace']
基本的なインデックス作成
Pythonリストは0ベースです。 つまり 、リストの最初の要素はインデックス0
アクセスできます
arr = ['a', 'b', 'c', 'd']
print(arr[0])
>> 'a'
あなたは、インデックスによって、リストの2番目の要素にアクセスすることができます1
インデックスにより、第三の要素2
というように:
print(arr[1])
>> 'b'
print(arr[2])
>> 'c'
また、負のインデックスを使用して、リストの最後から要素にアクセスすることもできます。例えば。インデックス-1
はリストの最後の要素を与え、インデックス-2
はリストの最後から2番目の要素を与えます:
print(arr[-1])
>> 'd'
print(arr[-2])
>> 'c'
リストに存在しないインデックスにアクセスしようとすると、 IndexError
が発生します:
print arr[6]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range