Pythonの高度な特性——スライス(Slice)

7012 ワード

廖雪峰のウェブサイトを抜粋します
リストを定義します.
L = ['haha','xixi','hehe','heihei','gaga']

最初の3つの要素を取ります.
>>> L[0],L[1],L[2]
('haha', 'xixi', 'hehe')

この方法は少し愚かです.もし要素が非常に多いなら、前のN要素を取る必要があります.どうすればいいですか.
ループを使うことを考えるかもしれません.
>>> r=[]
>>> n = 3
>>> for i in range(n):
...     r.append(L[i])
...
>>> r
['haha', 'xixi', 'hehe']

しかし、このような頻繁によく用いられる操作手段は、基本的にすべての言語で簡単な操作方法を提供するものであり、Substring法(通称サブストリング)のようなものであり、pythonも同様の方法を提供するものであり、これがスライス(Slice)である.
例:
>>> L[0:3]
['haha', 'xixi', 'hehe']

なお、L[0:3]は、インデックス0から、インデックス3が分かるまでを表すが、インデックス3、すなわちインデックス0,1,2は含まない.
最初のインデックスが0の場合は、省略することもできます.
>>> L[:3]
['haha', 'xixi', 'hehe']

任意のインデックスから開始することもできます.
>>> L[1:2]
['xixi']

試してみることもできます.
>>> L[1:1]
[]

Pythonも逆数取りL[-1]をサポートしているので、逆数スライスをサポートしているかどうかを見てみましょう.(逆数の最初のインデックスは-1です)
>>> L[-2:]
['heihei', 'gaga']
>>> L[-3:-2]
['hehe']

まだ満足していないと感じたら、続けてみてください.
>>> m = list(range(100))#  range      0-99   ,    list   m
>>> m
[0, 1, 2, 3, 4, 5, 6, ……,99]
>>> m[:10]#     
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> m[-10:]#     
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> m[10:20]#  11-20  
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> m[:10:2]#     , 2     
[0, 2, 4, 6, 8]
>>> m[5:15:3]# 6-15   , 3     
[5, 8, 11, 14]
>>> m[::10]#     , 10     
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> m[:]#     ,        list
[0, 1, 2, 3, 4, 5, 6, 7,……,99]

tupleもスライス特性をサポートしていますが、結果もtupleです.
>>> n = (1,3,5,7)
>>> n[:3]
(1, 3, 5)

文字列を見てみましょう.
>>> 'abcdefghjklmn'[::2]
'acegjln'

文字列もスライスをサポートしますが、結果も文字列です.
もう1つの例を見てみましょう.
スライス機能を使用して、Pythonのstrip()機能のような関数trim(str)を作成します.文字列の先頭と末尾のスペースを除去します.
>>> def trim(str):
...     while str[:1]==' ':
...             str = str[1:]
...     while str[-1:] == ' ':
...             str = str[:-2]
...     return str
...
>>> trim('  abc  hh  welcome!      ')
'abc  hh  welcome!'