9.1 リストのコピーを作成する
Pythonでリストのコピーを作成するのは、リストを操作するときにデータに予期しない変更を避けるために必要な重要なタスクだよ。リストを扱うときは、浅いコピー(shallow)と深いコピー(deep)の違いを理解しておくことが大事だね。
浅いコピー
浅いコピーは新しいリストを作成するけど、要素は同じままだよ(要素が参照の場合、それらは参照としてコピーされる)。これを行う方法はいくつかあるよ:
list()関数を使用する場合:
original = [1, 2, 3]
copy = list(original)
スライスを使用する:
original = [1, 2, 3]
copy = original[:]
copy()メソッド:
深いコピー
深いコピーは、新しいリストを作成し、すべてのネストされたオブジェクトもコピーされるよ。これは、リストが他の変更可能なデータ型(例えば、他のリスト)が含まれている場合に特に重要だね。このためにはcopyモジュールを使うよ:
import copy
original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(original)
いつどのメソッドを使うか
浅いコピーはより速く、リストの要素が単純または重複する必要がない場合(例えば、文字列や数値など)に適しているよ。深いコピーは、リストの要素自体が変更可能なコレクションである場合や、コピーでの変更がオリジナルに反映されるべきでない場合に必要だよ。
9.2 リストから要素を削除する
リストから要素を削除するのはシンプルでありつつも複雑なタスクだね。
forループでリストをループすると、リストは特別な子オブジェクト、つまりイテレータを返す。これはforループでリストのすべての要素を通過するために使用されるんだ。でも、イテレータを使う(forループ中に)ときにリストから要素を削除すると、イテレータが正しく機能しなくなる可能性があるよ。
もし3番目の要素を削除したら、4番目の要素が自動的に3番目になるんだ。でもforループはイテレータによって新しい4番目の要素、もともと5番目だった要素に切り替わることになる。それで、4番目の要素が飛ばされることになるんだ。
以下は、安全に要素を削除するいくつかの方法だよ:
remove()メソッドを使用する
特定の要素を削除することがわかっている場合は、ループ内でremove()を使うことができるよ。でも、要素が多い場合には非効率的かもしれない。なぜなら、remove()を呼び出すたびに要素を探して削除するから、実行速度が遅くなるんだ。
新しいリストを作成する
より安全な方法は、保持したい要素だけを持つ新しいリストを作成することだよ:
original_list = [1, 2, 3, 4, 5, 6]
new_list = [x for x in original_list if x % 2 != 0] # 奇数だけを保持する
インデックスを使用する
forループを逆インデックスで使って、要素を安全に削除できるよ:
for i in range(len(original_list) - 1, -1, -1):
if original_list[i] % 2 == 0: # 削除の条件
del original_list[i]
リストを後ろから進んでいけば、要素を削除しても既に通過した要素のインデックスだけが変わるんだ。
リストのコピーを使う:
例えば、リストからすべての負の数を削除したいときは:
numbers = [1, -1, 2, -2, 3, -3]
# 安全なイテレーションのためにリストのコピーを作成
for number in numbers.copy():
if number < 0:
numbers.remove(number)
print(numbers) # 出力は[1, 2, 3]
9.3 リストの結合
よくやるのは、2つ以上のリストを1つに結合することだよ。これはいくつかの方法でできて、それぞれがいろいろなタスクに適しているし、独自の特徴があるんだ。
+演算子を使う
2つのリストを統合する最も単純な方法は+演算子を使うことだよ。これは直接的で直感的な方法なんだ:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = list1 + list2
print(combined_list) # 出力は[1, 2, 3, 4, 5, 6]
extend()メソッド
extend()メソッドを使うと、最初のリストを変更し、2番目のリストのすべての要素をその終わりに追加するよ。これは元のリストを変更するんだ:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1) # 出力は[1, 2, 3, 4, 5, 6]
リスト内包表記(List Comprehensions)
リスト内包表記を使って、複数のリストから要素を結合して新しいリストを作成することができるよ:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = [item for sublist in [list1, list2] for item in sublist]
print(combined_list) # 出力は[1, 2, 3, 4, 5, 6]
append()メソッド
2番目のリストのすべての要素を1つずつ1番目のリストに追加することができるね。まあ、これは一つの方法なんだ。
list1 = [1, 2, 3]
list2 = [4, 5, 6]
for x in list2:
list1.append(x)
print(list1) # 出力は[1, 2, 3, 4, 5, 6]
リストについては、だいたいこんなところかな😊
GO TO FULL VERSION