HOWTO · Python
Python でリストのユニオンを取得する
リストの連合は、異なるリストのすべての要素が単一のリスト内に配置されることを反映しています。
このページの内容
Pythonでは、+ はリストを連結します。2番目のリストの要素を1番目のリストの後ろに並べ、重複した値もそのまま残します。これは、各値を1つずつ含め、順序を保証しない数学的な集合の和集合とは異なります。順序と重複を保つなら連結を使い、順序付けが必要なら sorted() を加え、ハッシュ可能な値だけを重複なく取り出すなら set() を使います。以下の例はそれぞれ単独で実行でき、結果の値を示しています。
+ で2つのリストを連結し、重複を残す
+ を使うと、順序と各要素の出現回数を保ったまま2つのリストを連結できます。結果は新しいリストなので、元の2つのリストも後で引き続き使えます。
first = ["red", "blue"]
second = ["blue", "green"]
combined = first + second
print(combined)
['red', 'blue', 'blue', 'green']
結果のリストには、first の要素に続いて second の要素が入ります。"blue" は両方の入力に含まれているため、2回現れます。これはリストの連結であり、値を重複なく集める和集合ではありません。
連結したリストをソートする
まずリストを連結し、その結果を Python の組み込み関数 sorted() に渡します。sorted() は入力を変更せず、昇順に並べた新しいリストを返します。ソートしても重複は取り除かれないため、各値は出現した回数だけ結果に残ります。
first = [11, 20, 1, 2, 3, 4, 5]
second = [2, 4, 6, 8, 10]
combined = first + second
sorted_combined = sorted(combined)
print(sorted_combined)
[1, 2, 2, 3, 4, 4, 5, 6, 8, 10, 11, 20]
数値の場合、値は数値の順に並びます。ソート対象の値同士は比較できる必要があります。たとえば、Pythonでは整数と文字列の間に一般的な昇順は定義されていません。
2つのリストを連結して重複を取り除く
連結したリストを set() で集合に変換し、後続の処理でリストが必要なら、その集合をリストに戻します。集合には各値が1つずつ含まれますが、反復時の順序は保証されません。また、要素はハッシュ可能でなければなりません。そのため、この方法は数値や文字列などには使えますが、入れ子になったリストには使えません。
first = [1, 2, 3, 4, 5]
second = [2, 4, 6, 8, 10]
unique_values = list(set(first + second))
print(unique_values)
[1, 2, 3, 4, 5, 6, 8, 10]
位置よりも値が重複なく含まれることを重視する場合に、この方法を使います。連結した値をソートする必要もあるなら、結果のリストを sorted() で明示的にソートしてください。
3つ以上のリストを連結して重複を取り除く
複数の入力を扱う場合は、集合に対して union() を呼び出し、各リストを引数として渡します。union() は集合のメソッドで、複数のイテラブルを受け取り、ハッシュ可能な値を重複なく含む集合を返します。戻り値としてリストが必要なら、結果をリストに変換します。2つのリストを扱う例と同様に、出力の順序は保証されません。
first = [1, 2, 3, 4, 5]
second = [2, 4, 6, 8, 10]
third = [5, 6, 7, 8, 11, 15, 18]
unique_values = list(set().union(first, second, third))
print(unique_values)
[1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 15, 18]
union() に別のリストを追加の引数として渡せば、さらにリストを加えられます。値がハッシュ不可能な場合は、適切なハッシュ可能な形式に変換するか、別の重複除去方法を使ってください。集合には、変更可能なリストや辞書をそのまま含めることはできません。