Pythonで2つのリストが循環的に同一かどうかを判定する方法
この記事では、2つのリストが与えられたとき、それらが循環的に同一(circularly identical)であるかどうかを判定するPythonプログラムを紹介します。循環的に同一とは、片方のリストの要素を回転させたとき、もう片方のリストと完全に一致する状態を指します。
実行例
入力 : A = [100, 100, 10, 10, 100]
B = [100, 100, 100, 10, 10]
出力 : True
解説
リストAの要素を順番に循環的に回転させると、リストBと同じ並びになるため、結果は True となります。つまり、開始位置が異なるだけで、要素の並びのパターン自体は同じだということです。
アルゴリズム
ステップ1:比較対象となる2つのリストを作成する。 ステップ2:リストを map オブジェクトに変換する。 ステップ3:join() メソッドを使って、リストの各要素を文字列に連結する。 ステップ4:リストAを2倍にして(A * 2)、再び文字列化する。 ステップ5:2つの文字列を比較する。結果が True なら2つのリストは循環的に同一、False なら循環的に同一ではない。
ポイントは、リストAを2倍にした文字列の中に、リストBの文字列が部分文字列として含まれるかどうかを調べる点です。これにより、あらゆる回転パターンを一度の検索で確認できます。
サンプルコード
# 2つのリストが循環的に同一かどうかを判定するPythonプログラム
A = list()
n = int(input("1つ目のリストのサイズを入力してください ::"))
print("1つ目のリストの要素を入力してください ::")
for i in range(int(n)):
k = int(input(""))
A.append(k)
B = list()
n1 = int(input("2つ目のリストのサイズを入力してください ::"))
print("2つ目のリストの要素を入力してください ::")
for i in range(int(n1)):
k = int(input(""))
B.append(k)
C = list()
n3 = int(input("3つ目のリストのサイズを入力してください ::"))
print("3つ目のリストの要素を入力してください ::")
for i in range(int(n3)):
k = int(input(""))
C.append(k)
print("1つ目のリストと2つ目のリストを比較 ::>")
print(' '.join(map(str, B)) in ' '.join(map(str, A * 2)))
print("2つ目のリストと3つ目のリストを比較 ::>")
print(' '.join(map(str, C)) in ' '.join(map(str, A * 2)))
出力結果
Enter the size of the First List :: 5 Enter the Element of First List :: 10 10 0 0 10 Enter the size of the Second List :: 5 Enter the Element of the Second List :: 10 10 10 0 0 Enter the size of the Third List :: 5 Enter the Element of the Third List :: 1 10 10 0 0 Compare First List and Second List ::> True Compare Second List and Third List ::> False
まとめ
この手法では、リストを2倍に展開して文字列として結合し、in 演算子で部分文字列の一致を確認するだけなので、コードが非常にシンプルになります。ただし、数値の桁数が混在する場合には、意図しない一致を避けるために区切り文字(例えばスペース)を必ず挟むことが重要です。回転の判定が必要な場面で、ぜひ活用してみてください。
-
Pythonでブロックの高さリストが直線y=xに対して対称かどうかを判定するプログラム
数値のリスト nums があるとします。これは正方形のブロックを横一列に並べたときの、各列の高さを表しています。ここで、このブロック形状が直線 y = x に対して対称であるかどうかを判定する必要があります。 たとえば、入力が nums = [7, 5, 3, 2, 2, 1, 1] の場合、出力は True になります。 解き方のアプローチ この問題は、リストの両端から同時に走査していくことで効率的に判定できます。手順は次のとおりです。 i を 0、j を「リストの長さ - 1」で初期化します。 i <= j である間、次の処理を繰り返します。 h := nums[j](右側の
-
Pythonで2つの二分木の葉の並び(シーケンス)が同じかどうかを確認する方法
はじめに2つの二分木が与えられたとき、それぞれの木を左から右へたどったときの葉ノードの並び(シーケンス)が一致しているかどうかを判定する問題を考えてみましょう。例えば、次のような2つの木が入力として与えられた場合を想定します。この場合、どちらの木も葉の並びは [2, 6] となるため、出力は True になります。解決のアプローチこの問題を解くためには、以下の手順に従います。結果を格納するための新しいリスト c を用意します。inorder() 関数を定義します。この関数はルートノードとリスト c を引数に取ります。c が null の場合は、新しい空のリストを作成します。ルートノードが nu