1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonAdvent Calendar 2023

Day 25

Pythonのスライスはコロン":"だけじゃない?slice()の活用法

Last updated at Posted at 2023-12-24

はじめに

Pythonのスライス機能は非常に便利で、コロン(":")での表記が一般的ですが、組み込み関数slice()は複雑な操作などや変数へ保存する場合に役立ちます。

slice()の使い道として、複数の配列に対して同じスライスをする適用する場合などが挙げられます。(コロン表記では、通常変数のスライス情報の保存はできないです。)

Pythonはコロン表記がお馴染みで、あまりslice()が知られていないと思い、本記事を書きました。

コロン":"とslice()の比較

コロン":"とslice()の書き方と処理速度を簡単に比較します。

実装はGoogle Colabに挙げています。

書き方

コロン(":")の使用

リストのスライスは通常、start:stop:stepの形式で記述されます。startはスライスの開始位置、stopは終了位置、stepはステップ(スキップする幅)を指定します。

slice()の使用

slice()オブジェクトはslice(start, stop, step)の形式で記述されます。startstopstepはコロンで指定する各要素と同じ意味です。

例1(要素番号1から6までを1ずつ抜き出す)

lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]と定義したときに、lisの要素番号1から6まで1ずつ抜き出す場合の書き方です。

# 例1(要素番号1から6までを1ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice coron:', lis[1:7])

slice_object = slice(1, 7, 1)
print('slice object:', lis[slice_object])
print('slice object:', lis[slice(1, 7, 1)])  # もちろん直接slice()を書いてもOK
print('slice object:', lis[slice(1, 7)])  # 1ずつ抜き出す場合は最後の引数を省略OK
print('slice object:', lis[slice(1, 7, None)])  # 1ずつ抜き出す場合は最後の引数を`None`でもOK
出力
slice coron: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]
slice object: [1, 2, 3, 4, 5, 6]

例2(要素番号1から6までを2ずつ抜き出す)

lisの要素番号1から6まで2ずつ抜き出す場合の書き方も確認しておきます。

# 例2(要素番号1から6までを2ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice coron:', lis[1:7:2])

slice_object = slice(1, 7, 2)
print('slice object:', lis[slice_object])
出力
slice coron: [1, 3, 5]
slice object: [1, 3, 5]

例3(コロンの要素番号の省略のslice()での書き方)

# 例3(要素を2ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice coron:', lis[::2])

slice_object = slice(None, None, 2)  # コロンの省略は`None`に対応
print('slice object:', lis[slice_object])
出力
slice coron: [0, 2, 4, 6, 8]
slice object: [0, 2, 4, 6, 8]

例4(slice()のトリッキーな書き方))

# 例4(要素番号0から2まで1ずつ抜き出す)
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print('slice coron:', lis[:2:])

print('slice object:', lis[slice(None, 2, None)])  # コロンの省略は`None`に対応
print('slice object:', lis[slice(2)])  # 少しトリッキーな書き方
出力
slice coron: [0, 1]
slice object: [0, 1]
slice object: [0, 1]

処理速度の比較

処理速度の比較には、同じ処理を1000万回を5反復した平均を使って評価します。以下はGoogle Colabで%%timeitを用いて計測した結果になります。

※処理速度の比較は、あまり深く検討しているわけではないので参考までにお願いします。

コロン":"の処理速度
%%timeit -n 10000000 -r 5
lis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
slice_coron = lis[1:7:2]
# -> 221 ns ± 54.9 ns per loop (mean ± std. dev. of 5 runs, 10000000 loops each)
slice()の処理速度
%%timeit -n 10000000 -r 5
lis = [0, 1, 2, 3, 4, 5]
slice_object = lis[slice(1, 7, 2)]
# -> 327 ns ± 124 ns per loop (mean ± std. dev. of 5 runs, 10000000 loops each)

コロンの方が処理速度自体は速い結果となりました。

まとめ

Pythonのリストスライスには通常コロン(":")で十分ですが、複数の配列にスライスを適用する場合やスライス情報を変数に保存したい場合には、slice()も便利です。ちなみに、処理速度はコロンの方が速い結果となったので、状況によって使い分けていきましょう。

参考資料

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?