Python中級

中級 Pythonで学ぶデータ構造|アンチパターン編

導入

データ構造はプログラミングの基盤であり、特に中級から上級エンジニアにとっては、適切なデータ構造の選択がパフォーマンスや可読性に大きな影響を与える。この記事では、データ構造に関するアンチパターンを掘り下げ、実際の業務で遭遇する具体的なシチュエーションを通じて、ありがちな失敗例とその改善点を示す。

教科書レベルの解説(データ構造)

重要な概念の整理

データ構造とは、データを効率的に格納し、操作するための方法であり、特定の問題を解決するために設計されている。例えば、リスト、セット、辞書などの基本的なデータ構造は、それぞれ異なる特性を持ち、用途に応じて使い分ける必要がある。適切なデータ構造を選ぶことで、アルゴリズムの効率を最大化することが可能である。

コード例(Python)


def find_duplicates(input_list):
    seen = set()
    duplicates = set()
    for item in input_list:
        if item in seen:
            duplicates.add(item)
        else:
            seen.add(item)
    return duplicates

コードの行ごとの解説

  1. def find_duplicates(input_list): – 重複を検出する関数を定義する。
  2. seen = set() – 既に見た要素を格納するためのセットを初期化する。
  3. duplicates = set() – 重複した要素を格納するためのセットを初期化する。
  4. for item in input_list: – 入力リストの各要素を反復処理する。
  5. if item in seen: – 要素が既に見たセットに存在するかをチェックする。
  6. duplicates.add(item) – 重複した要素を重複セットに追加する。
  7. seen.add(item) – 新たに見た要素を既に見たセットに追加する。
  8. return duplicates – 重複した要素のセットを返す。

アンチパターン編

上記のコードは一見シンプルで効率的に見えるが、実際にはいくつかの落とし穴が潜んでいる。例えば、入力リストが非常に大きい場合、メモリの使用量が増加し、パフォーマンスが低下する可能性がある。また、重複を検出するためにセットを使用することは一般的だが、挿入順序を保持したい場合には適さない。これを解決するためには、リストを使用し、重複を検出するロジックを工夫する必要がある。

以下は、改善されたバージョンのコードである:


def find_duplicates_ordered(input_list):
    seen = []
    duplicates = []
    for item in input_list:
        if item in seen:
            if item not in duplicates:
                duplicates.append(item)
        else:
            seen.append(item)
    return duplicates

このコードでは、リストを使用して挿入順序を保持しつつ、重複を検出するロジックを改善した。これにより、メモリの使用量を抑えつつ、必要なデータを保持することが可能になる。

まとめ

  • データ構造の選択は、パフォーマンスと可読性に大きな影響を与える。
  • 重複検出の際には、セットだけでなくリストも検討することで、異なる要件に応じた柔軟な実装が可能となる。