Pythonスライスの高度な使い方について
Pythonのリスト(list)、メタグループ(tuple)、文字列(str)などのシーケンスタイプは、スライス操作をサポートします.
1最後の要素設計
スライス操作には区間範囲の最後の要素は含まれません.PythonはJava言語と同様に0を先頭に下付きます.このようなメリットは、 は、
実行結果:
2スライス間隔
実行結果:
3操作スライス
スライスを付与文の左側に置くと、シーケンスを直接変更できます.これをdel操作の対象とすれば,シーケンスを切除操作することができる.
Luciano Ramalhoはこのような例を挙げています.
実行結果:
割り当てられたオブジェクトがスライスである場合は、反復可能なオブジェクトでなければなりません.値が1つでも反復可能なシーケンスに変換する必要があります.例えば、例の最後の例が直接100を
1最後の要素設計
スライス操作には区間範囲の最後の要素は含まれません.PythonはJava言語と同様に0を先頭に下付きます.このようなメリットは、
[:x]
構文が見られると、スライス内にx個の要素が含まれていることがわかる.[start:stop]
構文が見られると、スライス内にstop-start個の要素が含まれていることがわかる.my_list[:x]
(範囲0~x-1)とmy_list[x:]
(範囲x~len-1)のように、1つの下付きスケールでシーケンスを重ならない2つの部分に分割することができる.l=[10, 20, 30, 40, 50, 60]
logging.info('l[:2] -> %s',l[:2])
logging.info('l[2:] -> %s',l[2:])
logging.info('l[:3] -> %s',l[:3])
logging.info('l[3:] -> %s',l[3:])
logging.info('l[1:2] -> %s',l[1:2])
実行結果:
INFO - l[:2] -> [10, 20]
INFO - l[2:] -> [30, 40, 50, 60]
INFO - l[:3] -> [10, 20, 30]
INFO - l[3:] -> [40, 50, 60]
INFO - l[1:2] -> [20]
2スライス間隔
s [ a : b : c ]
の構文を用いて、s中のaとbの間の要素をc間隔でスライスすることもできる.c値が負の場合、逆取値が行われます.s='python'
logging.info('s[::3] -> %s',s[::3])
logging.info('s[::-1] -> %s',s[::-1])
logging.info('s[::-2] -> %s',s[::-2])
実行結果:
INFO - s[::3] -> ph
INFO - s[::-1] -> nohtyp
INFO - s[::-2] -> nhy
3操作スライス
スライスを付与文の左側に置くと、シーケンスを直接変更できます.これをdel操作の対象とすれば,シーケンスを切除操作することができる.
Luciano Ramalhoはこのような例を挙げています.
l=list(range(10))
logging.info('l -> %s',l)
l[2:5]=[20,30]
logging.info('l -> %s',l)
del l[5:7]
logging.info('l -> %s',l)
l[3::2]=[11,22]
logging.info('l -> %s',l)
l[2:5]=[100]
logging.info('l -> %s',l)
l[2:5]=100
実行結果:
INFO - l -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
INFO - l -> [0, 1, 20, 30, 5, 6, 7, 8, 9]
INFO - l -> [0, 1, 20, 30, 5, 8, 9]
INFO - l -> [0, 1, 20, 11, 5, 22, 9]
INFO - l -> [0, 1, 100, 22, 9]
Traceback (most recent call last):
...
l[2:5]=100
TypeError: can only assign an iterable
割り当てられたオブジェクトがスライスである場合は、反復可能なオブジェクトでなければなりません.値が1つでも反復可能なシーケンスに変換する必要があります.例えば、例の最後の例が直接100を
l[2:5]
に割り当てると、PythonはTypeError:can only assign an iterableエラーを投げ出す.