【Python入門】リストの要素が回文かどうかを判定する方法
Pythonでは、数値や文字列のリストが回文(前から読んでも後ろから読んでも同じ並び)になっているかどうかを簡単に判定できます。
例えば、次のようなリストが与えられたとします。
nums = [10, 12, 15, 12, 10]
この場合、前から読んでも後ろから読んでも 10, 12, 15, 12, 10 と同じ順序になるため、出力は True となります。
解決の手順
リストが回文かどうかを確認するには、以下の手順に従います。
- 変数
nにリストのサイズ(要素数)を代入する - フラグ用の変数
is_palindromeを初期化する - インデックス
iを 0 で初期化する iがn // 2以下で、かつnが 0 でない間、以下を繰り返すnums[i]とnums[n - i - 1](後ろから数えた対応する要素)が一致しない場合は、is_palindromeをセットしてループを抜ける- 一致していれば
iを 1 増やす
is_palindromeがセットされていればFalseを返す- そうでなければ
Trueを返す
ポイントは、リストの先頭と末尾を同時に比較していく点です。中央まで一致し続ければ回文であると判断できます。
実装例
実際のコードは次のようになります。
def solve(nums):
n = len(nums)
is_palindrome = 0
i = 0
while i <= n // 2 and n != 0:
if nums[i] != nums[n - i - 1]:
is_palindrome = 1
break
i += 1
if is_palindrome == 1:
return False
else:
return True
nums = [10, 12, 15, 12, 10]
print(solve(nums))
入力
[10, 12, 15, 12, 10]
出力
True
より簡潔な書き方:スライスを活用する
Pythonではスライス記法を使うことで、上記のロジックをわずか1行で表現できます。リストを反転したもの(nums[::-1])と元のリストを比較すればよいのです。
def solve(nums):
return nums == nums[::-1]
nums = [10, 12, 15, 12, 10]
print(solve(nums)) # True
この方法はコードが短く読みやすい一方、リスト全体のコピーを作成するため、非常に大きなリストではメモリを余分に消費する点に注意してください。パフォーマンスが重要な場面では、最初に紹介したような両端からの比較方式が有利です。
まとめ
リストが回文かどうかの判定は、両端から中央へ向かって要素を比較することで実装できます。Pythonなら nums == nums[::-1] というスライスを使った簡潔な記述も可能です。用途やデータサイズに応じて、適切な方法を選びましょう。
-
Pythonで二分木のすべてのノードの値が同じかどうかをチェックするプログラム
問題の概要二分木が与えられたとき、その木に含まれるすべてのノードが同じ値を持っているかどうかを判定することを考えます。例えば、次のような二分木が入力として与えられた場合、すべてのノードが同じ値を持っているため、出力は True になります。解決のアプローチこの問題は、再帰を使ってシンプルに解くことができます。以下の手順に従います。solve() 関数を定義します。この関数は root(現在のノード)と val(比較対象の値)を引数として受け取ります。root が null(None)の場合は、True を返します。空の部分木は条件を満たしているとみなせるためです。val が未定義の場合は、ro
-
【Python】リスト内のすべての要素が同じ値かどうかを確認する3つの方法
リスト内の要素がすべて同じ値であるかどうかを確認したい場面はよくあります。たとえば、データの整合性チェックやバリデーション処理などで必要になることがあります。Pythonでは、このような判定をいくつかの方法で実装できます。本記事では、代表的な3つのアプローチをサンプルコードとともにわかりやすく解説します。1. forループを使う方法まずリストの先頭要素を取得し、forループで各要素を順番に先頭要素と比較していきます。途中で一致しない要素が見つかった時点でループを抜け、結果をFalseにするのがポイントです。サンプルコードList = [Mon, Mon, Mon, Mon] result =