Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで2つのリストが同一かどうかを確認する方法

Pythonでデータ分析を行っていると、2つのリストを比較して、それらが同一(同じ要素を持つ)かどうかを確認したい場面に遭遇することがあります。本記事では、代表的な2つの方法——「ソートして比較する方法」と「collections.Counterを使う方法」——を具体的なコード例とともに解説します。

方法1:ソートして比較する

要素の順序が異なっていても、含まれる要素が同じであれば同一とみなしたい場合は、両方のリストをあらかじめソートしておくと簡単です。sort()メソッドで各リストを昇順に並べ替えてから、==演算子で等しいかどうかを判定します。

コード例

listA = ['Mon','Tue','Wed','Thu']
listB = ['Mon','Wed','Tue','Thu']

# 与えられたリストを表示
print("Given listA: ", listA)
print("Given listB: ", listB)

# リストをソート
listA.sort()
listB.sort()

# 同一かどうかを確認
if listA == listB:
    print("Lists are identical")
else:
    print("Lists are not identical")

実行結果

上記のコードを実行すると、次のような出力が得られます。

Given listA: ['Mon', 'Tue', 'Wed', 'Thu']
Given listB: ['Mon', 'Wed', 'Tue', 'Thu']
Lists are identical

このように、listAとlistBは要素の並び順こそ違うものの、ソート後の比較では同一であると判定されました。

方法2:Counterを使って比較する

collectionsモジュールのCounter関数を使うと、リスト内の各要素の出現回数をカウントできます。この方法は、重複した要素が含まれる場合にも有効です。両方のリストで各要素の出現頻度が一致していれば、そのリストは同一とみなせます。

コード例

import collections

listA = ['Mon','Tue','Wed','Tue']
listB = ['Mon','Wed','Tue','Tue']

# 与えられたリストを表示
print("Given listA: ", listA)
print("Given listB: ", listB)

# 同一かどうかを確認
if collections.Counter(listA) == collections.Counter(listB):
    print("Lists are identical")
else:
    print("Lists are not identical")

# もう一度確認(listBの内容を変更)
listB = ['Mon','Wed','Wed','Tue']
print("Given listB: ", listB)

# 同一かどうかを確認
if collections.Counter(listA) == collections.Counter(listB):
    print("Lists are identical")
else:
    print("Lists are not identical")

実行結果

上記のコードを実行すると、次のような出力が得られます。

Given listA: ['Mon', 'Tue', 'Wed', 'Tue']
Given listB: ['Mon', 'Wed', 'Tue', 'Tue']
Lists are identical
Given listB: ['Mon', 'Wed', 'Wed', 'Tue']
Lists are not identical

最初の比較では、'Tue'が2回出現する頻度が両リストで一致しているため「同一」と判定されました。一方、2回目の比較ではlistB内の'Wed'の出現回数が増えたため、頻度が一致せず「同一ではない」と正しく判定されています。

まとめ

  • ソートして比較: 要素の種類と個数が同じなら同一としたい場合にシンプルで分かりやすい方法です。
  • Counterで比較: 重複要素を含むリストでも、各要素の出現頻度に基づいて正確に判定できます。

用途に応じてこれらの方法を使い分けることで、Pythonにおけるリスト比較を効率的に行えます。

  1. Pythonで2つの二分木の全レベルがアナグラムかどうかを判定する方法

    問題概要 2つの二分木が与えられたとき、片方の木の各レベルに含まれる値の集合が、もう片方の木の同じレベルの値のアナグラム(並べ替え)になっているかどうかを判定します。すべてのレベルがアナグラムであれば True を、そうでなければ False を返します。 例えば、次のような入力が与えられた場合を考えてみましょう。 この場合、出力は True になります。 解法のアプローチ この問題は、幅優先探索(BFS)を応用して解くことができます。各レベルごとにノードの値を収集し、ソートした上で比較するのがポイントです。手順は以下の通りです。 tree_1 を1つ目の木のルートノード、tree_2 を

  2. 【Python】2つの数値の2進表現がアナグラムかどうかを判定するプログラム

    2つの数値が与えられたとき、その2進表現同士がアナグラム(同じ文字を並べ替えたもの)になっているかどうかを判定します。Pythonでは、collectionsモジュールのCounterクラスと辞書の比較を組み合わせることで、この問題をシンプルかつ効率的に解くことができます。 実行例 入力: a = 8, b = 16 出力: Yes 両方の数値の2進表現は、0と1の個数が同一です。 アルゴリズム ステップ1 : 2つの数値を受け取ります。 ステップ2 : bin()関数で各数値を2進数の文字列に変換し、接頭辞「0b」に相当する先頭2文字を取り除きます。 ステップ3 : 2つの2進表現は