[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