問題の歴史: スライス(スライシング)は、Pythonの初期から存在する構文的に便利な方法で、ループを使って手動で繰り返すことなく、シーケンスの断片を取得するためのものです。
問題: 他の言語から来たプログラマーは、しばしばサブリストを操作するために明示的なループを使用します。これにより、コードの量が増え、生産性が低下します。
解決策: リストスライシングを使用すると、リスト、文字列、または他のシーケンスの部分をコンパクトかつ効率的に取得できます。スライスは元のオブジェクトを変更することなく、そのコピーまたはビュ(特定の型の場合)を返します。
コード例:
lst = [0, 1, 2, 3, 4, 5] sub = lst[1:4] # [1, 2, 3] reverse = lst[::-1] # [5, 4, 3, 2, 1, 0] every_second = lst[::2] # [0, 2, 4]
主な特徴:
スライスの値を変更すると元のリストに影響しますか?
いいえ: スライスに新しいリストを代入すると、その位置の元のリストが変更されますが、スライスを取ると新しいリストが得られます。
例:
lst = [1, 2, 3, 4] lst2 = lst[1:3] # [2, 3] lst2[0] = 20 # lstには影響しない: lst2は新しいオブジェクト
しかし:
lst[1:3] = [7, 8] # これはlstを直接変更します
負のインデックスを持つスライスはどのように機能しますか?
負のインデックスは、終わりから数えられます: -1は最後の要素、-2は最後から2番目の要素です。例えば、lst[:-1]は最後の要素以外のすべての要素を意味します。
スライスでリストの境界を越えるとどうなりますか?
Pythonは"賢く"これらのケースを処理します: エラーは発生せず、単にスライスは利用可能な境界に切り詰められます。例えば、lst[100:200]は空のリストまたは最大のサブリストを返します。
リストの処理には数百行の入れ子のループと条件が必要で、入力データを"切り取る"ためにコードが複雑で遅い。
利点:
欠点:
同じコードがスライシングと組み込み関数を使用して書き換えられ、行数が減り、テストが簡単になる。
利点:
欠点: