はじめに
Pythonのスライスは、文字列切り取りや、リストの要素抜き出しに使える。文字検索のrfindも組み合わせればいろいろ分離、抜き出しができて便利。使い方をよく忘れるので備忘録としてまとめる。
目次
基本
開始位置、終了位置、ステップの3値で設定可能。それぞれ省略することも可能。数値は0オリジン。マイナスの値を指定することもできる。ステップをマイナスにした場合、後ろから処理されるのでstart/endの関係が逆になる点注意。
表記 | 内容 |
---|---|
[start : ] | 開始位置だけ指定 |
[ : end] | 終了位置だけ指定 |
[start : end] | 開始位置、終了位置指定 |
[start : end : step] | 開始位置、終了位置、ステップ指定 |
[ : : step] | ステップだけ指定 |
[start : : step] | 開始位置、ステップ指定 |
[ : end : step] | 終了位置、ステップ指定 |
slice.py
# +---+---+---+---+---+---+---+---+---+---+---+
# | 0| 10| 20| 30| 40| 50| 60| 70| 80| 90|100|
# +---+---+---+---+---+---+---+---+---+---+---+
# | a | b | c | d | e | f | g | h | i | j | k |
# +---+---+---+---+---+---+---+---+---+---+---+
# 0 1 2 3 4 5 6 7 8 9 10 11
#-11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
list_slice=[0,10,20,30,40,50,60,70,80,90,100]
str_slice='abcdefghijk'
#5から開始------------
print(list_slice[5:]) #[50, 60, 70, 80, 90, 100]
print(str_slice[5:]) #fghijk
#5で終了--------------
print(list_slice[:5]) #[0, 10, 20, 30, 40]
print(str_slice[:5]) #abcde
#2~8まで-------------
print(list_slice[2:8]) #[20, 30, 40, 50, 60, 70]
print(str_slice[2:8]) #cdefgh
#2~8までステップ2----
print(list_slice[2:8:2])#[20, 40, 60]
print(str_slice[2:8:2]) #ceg
#ステップ2------------
print(list_slice[::2]) #[0, 20, 40, 60, 80, 100]
print(str_slice[::2]) #acegik
#2から開始ステップ2---
print(list_slice[2::2]) #[20, 40, 60, 80, 100]
print(str_slice[2::2]) #cegik
#8までステップ2-------
print(list_slice[:8:2]) #[0, 20, 40, 60]
print(str_slice[:8:2]) #aceg
#2~-2(後ろから2なので9)ステップ2---
print(list_slice[2:-2:2])#[20, 40, 60, 80]
print(str_slice[2:-2:2]) #cegi
#8~2をステップ-1-----
print(list_slice[8:2:-1])#[80, 70, 60, 50, 40, 30]
print(str_slice[8:2:-1]) #ihgfed
値を代入
スライスを使って、リスト要素を入れ替えることもできる。指定したリスト要素数が指定スライス範囲と一致していれば入れ替え。違う場合は、要素数も変化する点注意。
slice.py
# +---+---+---+---+---+---+---+---+---+---+---+
# | 0| 10| 20| 30| 40| 50| 60| 70| 80| 90|100|
# +---+---+---+---+---+---+---+---+---+---+---+
# 0 1 2 3 4 5 6 7 8 9 10 11
#-11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
list_slice=[0,10,20,30,40,50,60,70,80,90,100]
#入れ替え10,20,30 の部分をいれかえ
list_slice[1:4]=[100,200,300]
print(list_slice)
# [0, 100, 200, 300, 40, 50, 60, 70, 80, 90, 100]
#10,20,30の部分を0に入れ替える
list_slice[1:4]=[0]
print(list_slice)
# [0, 0, 40, 50, 60, 70, 80, 90, 100]
文字列入れ替え
スライスを使って、文字列を入れ替えることもできる。
slice.py
# +---+---+---+---+---+---+---+---+---+---+---+
# | a | b | c | d | e | f | g | h | i | j | k |
# +---+---+---+---+---+---+---+---+---+---+---+
# 0 1 2 3 4 5 6 7 8 9 10 11
#-11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
str_slice='abcdefghijk'
str_replace='CDEFG'
#c ~ str_replace 文字列に入れ替え
str_slice = str_slice[:2] + str_replace + str_slice[2+len(str_replace):]
print(str_slice)
# abCDEFGhijk
rfind 組み合わせ
開始位置、終了位置をrfind
で指定すれば、特定の文字列の位置で区切ることができる。例えば、URLやファイルパスの/
や\
で分離したい場合などに有効。
rfindを使った例。URLの終端と親を分離。
url切り抜き.py
url = 'https://qiita.com/tapitapi/items/d0a1df5f9f74aefa97d3'
#rfindで後ろから検索 終端を抜き出し
reaf = url[url.rfind('/')+1:]
print(reaf)
# d0a1df5f9f74aefa97d3
#rfindで後ろから検索 親部分を抜き出し
tree = url[:url.rfind('/')+1]
print(tree)
# https://qiita.com/tapitapi/items/
rfindを使った例。フォルダパスを1階層ずつ遡って配列に格納。
フォルダパス.py
path='C:\\Users\\USER_NAME\\AppData\\Local\\Programs\\Python\\Python38\\python.exe'
path_list=[]
#pathを1階層ずつ遡ってpath_list[]へ格納
while(path.count('\\')):
path_list.append(path)
path=path[:path.rfind('\\')]
print(path_list)
# ['C:\\Users\\USER_NAME\\AppData\\Local\\Programs\\Python\\Python38\\python.exe',
# 'C:\\Users\\USER_NAME\\AppData\\Local\\Programs\\Python\\Python38',
# 'C:\\Users\\USER_NAME\\AppData\\Local\\Programs\\Python',
# 'C:\\Users\\USER_NAME\\AppData\\Local\\Programs',
# 'C:\\Users\\USER_NAME\\AppData\\Local',
# 'C:\\Users\\USER_NAME\\AppData',
# 'C:\\Users\\USER_NAME',
# 'C:\\Users']
以上