【Python連載】リストの複製と比較


リスト同士の比較を行う際には注意しなければいけない事があります。
比較の行い方が2通りあるということです。

  • 同じリストなのか
  • 同じ順番で同じ要素を持っているか

の2通りなのですが、何が違うのかを順番に説明していきます。


リストの比較

まずは以下のプログラムを見てください。

list1 = ["left", "center", "right"]
list2 = list1                      #list1を格納

list3 = ["left", "center", "right"] #list1と同じ値を格納。

この様に定義するとリストは以下の様になります。

list1とlist2は「変数名は異なるが、リストの実体は同じものを見ている」という状態です。
list3は同じ値を格納しましたが、list1及びlist2とは異なる実体を見ています。

ではこれをプログラムで確認してみましょう。

list1 = ["left", "center", "right"]
list2 = list1                      #list1を格納

list3 = ["left", "center", "right"] #list1と同じ値を格納。

list1[1] = "真ん中"                 #list1の値を変更
print(list1)
print(list2)                       #list2の値も変わっています

print("-------")

list3[0] = "左"                    #list3の値を変更
print(list1)
print(list2)
print(list3)                       #list3は独立していたので他のリストは変わらない
C:\Python> python store.py

[‘left’, ‘真ん中’, ‘right’]
[‘left’, ‘真ん中’, ‘right’]
——-
[‘left’, ‘真ん中’, ‘right’]
[‘left’, ‘真ん中’, ‘right’]
[‘左’, ‘center’, ‘right’]

この様にlist1の変更はlist2にも影響が出ます。

今回の場合、
list1とlist2は同じリスト
list1及びlist2と、list3は要素が同じリスト
ということになります。

これで前提となる説明ができました。
それでは比較に入りましょう。


同じリストであるか比較する。

同じリストであるか比較するためには「is」を使用します。
同じであればTrueが、異なればFalseが返ってきます。

list1 = ["left", "center", "right"]
list2 = list1                      #list1を格納

list3 = ["left", "center", "right"] #list1と同じ値を格納。

compare1and2 = list1 is list2
compare1and3 = list1 is list3

print(compare1and2)
print(compare1and3)
C:\Python> python compare1.py
True
False

この様に1と2は同じ、1と3は異なるという判定になりました。


同じ順番で同じ要素を持っているか

では続いて同じ順番で同じ要素を持っているかを比較してみましょう。
こちらは今まで変数の比較で使用した「==」を使います。

list1 = ["left", "center", "right"]
list2 = list1                       #list1を格納

list3 = ["left", "center", "right"] #list1と同じ値を格納。

list4 = ["right", "center", "left"] #要素は同じだが順番が異なる

compare1and2 = list1 == list2
compare1and3 = list1 == list3
compare1and4 = list1 == list4

print(compare1and2)
print(compare1and3)
print(compare1and4)
C:\Python> python compare2.py
True
True
False

この様に同じ順番で同じ要素が格納されている場合はTrueになります。


リストを複製する

リスト複製する方法はいくつかあります。

  • 「=」で代入する
  • copy()を使用する
  • list()を使用する
  • スライスする

ではこれらが同じリストを作成するのか、同じ順番で同じ要素を持ったリストを作成するのか見ていきましょう。
1:同じリストかどうか
2:同じ順番で同じ要素を持ったリストかどうか
上記チェックの結果を出力していきます!

original = ["赤", "緑", "青"]

print("----------")

print("「=」で代入する")
equal = original
compare_is = str(equal is original)
compare_equal = str(equal == original)
print("1:" + compare_is)
print("2:" + compare_equal)

print("----------")

print("copy()を使用する")
copy = original.copy()
compare_is = str(copy is original)
compare_equal = str(copy == original)
print("1:" + compare_is)
print("2:" + compare_equal)

print("----------")

print("list()を使用する")
lists = list(original)
compare_is = str(lists is original)
compare_equal = str(lists == original)
print("1:" + compare_is)
print("2:" + compare_equal)

print("----------")

print("スライスを使用する")
slice = original[:]
compare_is = str(slice is original)
compare_equal = str(slice == original)
print("1:" + compare_is)
print("2:" + compare_equal)

print("----------")
C:\Python> python create_copy.py
———-
「=」で代入する
1:True
2:True
———-
copy()を使用する
1:False
2:True
———-
list()を使用する
1:False
2:True
———-
スライスを使用する
1:False
2:True
———-

上記の様な結果になったのではないでしょうか?
「=」のみが同じリストを作成し、
それ以外は同じ順番で同じ要素を持っているリストを作成している事が分かるかと思います。


まとめ

リストを比較または複製する際は、
・同じリストなのか
・要素が同じだけの別のリストなのか
に注意しよう!

  • このエントリーをはてなブックマークに追加

PAGE TOP