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

Pythonでリスト内の2つの要素間の最も近い出現位置を求める方法

Pythonでは、リスト内の2つの要素間で最も近い出現位置(インデックス)を求めたい場面があります。そのような場合は、3つの引数を受け取る関数を定義し、「not in」演算子とリスト内包表記を組み合わせることで、効率的に結果を得ることができます。

以下に具体的な実装例を示します。

サンプルコード

def nearest_occurence_list(my_list, x, y):
    if x not in my_list or y not in my_list:
        return -1
    x_index = [index for index in range(len(my_list)) if my_list[index] == x]
    y_index = my_list.index(y)
    min_dist = 1000000
    result = None
    for element in x_index:
        if abs(element - y_index) < min_dist:
            result = element
            min_dist = abs(element - y_index)
    return result

my_list = [12, 24, 15, 17, 28, 26, 13, 28, 14, 12, 20, 19, 24, 29, 14]
print('The list is :')
print(my_list)
x = 14
print('The value of x is ')
print(x)
y = 26
print('The value of y is ')
print(y)
print('The result is :')
print(nearest_occurence_list(my_list, x, y))

実行結果

The list is :
[12, 24, 15, 17, 28, 26, 13, 28, 14, 12, 20, 19, 24, 29, 14]
The value of x is
14
The value of y is
26
The result is :
8

コードの解説

  • nearest_occurence_listという名前の関数を定義し、リスト(my_list)と検索対象となる2つの値(x・y)の合計3つの引数を受け取ります。

  • xまたはyがリスト内に存在しない場合は、「not in」演算子による判定で-1を返して処理を終了します。

  • リスト内包表記を使ってリスト全体を走査し、xと一致するすべてのインデックスを抽出して変数x_indexに格納します。

  • 続いて、index()メソッドでyの最初の出現位置を取得し、変数y_indexに代入します。

  • 比較用の初期値として十分大きな距離(min_dist = 1000000)を設定し、x_index内の各インデックスとy_indexとの絶対差を順番に計算します。

  • 現在の最小距離よりも小さい差が見つかるたびに、そのインデックスをresultに、差をmin_distにそれぞれ更新します。

  • ループが完了した時点で、yに最も近いxの出現インデックスが返されます。

  • 関数の外側では、整数を要素とするリストを定義し、コンソールに表示します。

  • xに14、yに26を設定し、それぞれの値をコンソールに出力します。

  • 必要な引数を渡して関数を呼び出すと、結果として「8」がコンソールに表示されます。これは、y(インデックス5)に最も近いx=14の出現位置がインデックス8であることを意味します。

改善のヒント

サンプルコードでは最小距離の初期値として1000000というマジックナンバーを使っていますが、float('inf')(無限大)を使えば、どんなに大きなリストでも安全に動作します。また、enumerate()とmin()関数のkey引数を組み合わせると、ループ処理をより簡潔に書き換えることもできます。

def nearest_occurence_v2(my_list, x, y):
    if x not in my_list or y not in my_list:
        return -1
    y_index = my_list.index(y)
    return min((i for i, v in enumerate(my_list) if v == x),
               key=lambda i: abs(i - y_index))

いずれの方法でも計算量はO(n)となり、リストの長さに比例した時間で処理が完了します。

  1. 【初心者向け】Pythonでリストのサイズ(要素数)を取得する方法

    リスト(list)は、Pythonにおける代表的なコレクション型のデータ構造の一つです。リストの要素は後から変更でき、重複した値を持つこともできます。本記事では、Pythonでリストのサイズ(長さ)を取得する方法を解説します。具体的には、重複の有無にかかわらず、リストに含まれる全要素の数をカウントする方法を紹介します。リストの長さを取得する基本:len()関数Pythonでリストの要素数を取得するには、組み込み関数の len() を使用します。len() はリストだけでなく、タプル・文字列・辞書などさまざまなコレクションに対しても利用できる汎用的な関数です。サンプルコード以下の例では、「day

  2. 【初心者向け】Pythonで2つのリストの差分(違い)を抽出する方法を解説

    この記事では、2つのリストが与えられたときに、その差分(違い)を表示するPythonプログラムを紹介します。Pythonにはset()メソッドが用意されており、ここではこのメソッドを活用します。 セット(集合)とは、重複する要素を持たない順序なしのコレクションです。セットオブジェクトは、和集合・積集合・差集合・対称差といった数学的な操作もサポートしているため、リスト同士の比較に非常に便利です。 実行例 入力: A = [10, 15, 20, 25, 30, 35, 40] B = [25, 40, 35] 出力: [10, 20, 30, 15] 考え方 求めたい差分リストは、次のよう