恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

[Python]スライスによるリストの操作

スライスについて学習しました。


スライスの基本形

まずはコード例から見てみます。

watches = ['f.p.journe', 'seiko', 'lange', 'patek', 'omega']
print(watches[0:3])

2行目のwatchesに続く[ ]内がスライスの例です。
この例では、0が始点のインデックスで、3が終点のインデックスです。
インデックスにはリストの要素番号を指定します。

終点のインデックスには注意が必要です。
[0:3]と記述した場合、0番目から3番目の要素ではなく「0番目から2番目の」要素を取り出します。

実行結果

['f.p.journe', 'seiko', 'lange']


今度は、5つの要素のうち、真ん中の3つを取り出してみます。
通常の日本語だと「2番目から4番目の要素」ですが、要素番号で 記述すると「1番目から3番目の要素」です。
よって、スライス範囲は[1:4]となります。

watches = ['f.p.journe', 'seiko', 'lange', 'patek', 'omega']
print(watches[1:4])       # [1:5]としないように注意する。

実行結果

['seiko', 'lange', 'patek']


インデックスを省略した場合

(1) 終点を示すインデックスを省略した場合、最終要素までスライスします。

watches = ['f.p.journe', 'seiko', 'lange', 'patek', 'omega']
print(watches[2:])

実行結果

['lange', 'patek', 'omega']


(2) 始点を示すインデックスを省略した場合、先頭要素からスライスします。

watches = ['f.p.journe', 'seiko', 'lange', 'patek', 'omega']
print(watches[:3])

実行結果

['f.p.journe', 'seiko', 'lange']


要素をスキップする方法

スライスに3番目の値を指定するとスライス対象をスキップできます。

watches = ['f.p.journe', 'seiko', 'lange', 'patek', 'omega']
print(watches[0::2])     # 2つ後ろの要素へとスキップ

実行結果

['f.p.journe', 'lange', 'omega']


マイナスのインデックスも使用可能

マイナスのインデックスも使用できます。
たとえば、後ろから3つ目の要素番号は「-3」です。以下の例ではリストの最後にある3つの要素を取り出します。

watches = ['f.p.journe', 'seiko', 'lange', 'patek', 'omega']
print(watches[-3:])

実行結果

['lange', 'patek', 'omega']


スライスを使用してリストをコピーする(注意点あり)

インデックスを記述せずにスライスを使用することで、全ての要素を取り出します。

リストのコピー例

watches_a = ['f.p.journe', 'seiko', 'lange', 'patek', 'omega']
watches_b = watches_a[:]    # 全ての要素を取り出す

print(watches_b)

実行結果

['f.p.journe', 'seiko', 'lange', 'patek', 'omega']


思わず自分もやってしまいそうなので、ダメな例を書いておきます。
以下のコードでは別々のリストが作成されません。

watches_a = ['f.p.journe', 'seiko', 'lange', 'patek', 'omega']
watches_b = watches_a       # これはダメなやり方

このようにすると、watches_bは、watches_aが関連付けられているリスト に関連付けられます。
つまり、watches_aもwatches_bも同じリストを指している状態になってしまいます。

スライスを使ったループ

スライスを使うことで、リストの一部だけをループ対象にすることができます。

watches = ['f.p.journe', 'seiko', 'lange', 'patek', 'omega']

for watch in watches[1:4]:
    print(watch.upper())

実行結果

SEIKO
LANGE
PATEK