自分用:Python便利なコーディング

# Python便利なコーディング
自分用のメモとして、pythonでの便利なコーディング(書き方)を記しました。
(*追記、修正予定あり)

## テスト用のコード
```python
from typing import List
##テスト用クラス
class Hoge:
    count_test : int = 0

    def __init__(self,value):
        self.count_test = value

class HogeList:
    hoge_list : List[Hoge] = []

class HogeDict:
    hoge_dict: Dict[int, Hoge] = {}

    def add(self, item: Hoge):
        """Hogeオブジェクトを辞書に追加 (count_testをキーとする)"""
        self.hoge_dict[item.count_test] = item

    def get(self, key: int) -> Hoge:
        """指定されたキーに対応するHogeオブジェクトを取得"""
        return self.hoge_dict.get(key)

    def remove(self, key: int):
        """指定されたキーに対応するHogeオブジェクトを削除"""
        if key in self.hoge_dict:
            del self.hoge_dict[key]

    def to_list(self) -> List[Hoge]:
        """辞書内のすべてのHogeオブジェクトをリストとして取得"""
        return list(self.hoge_dict.values())

    def keys(self) -> List[int]:
        """辞書のすべてのキーをリストとして取得"""
        return list(self.hoge_dict.keys())

    def values(self) -> List[Hoge]:
        """辞書のすべての値（Hogeオブジェクト）をリストとして取得"""
        return list(self.hoge_dict.values())

    def items(self) -> List[tuple]:
        """辞書のキーと値のペアをタプルのリストとして取得"""
        return list(self.hoge_dict.items())
```

## 配列(List)

### Find系
条件に合うのを取得できるやり方

#### リスト内包表記(フィルタリング)
リスト内包表記（List Comprehension）は、Pythonでリストを簡潔かつ効率的に生成するための強力なツールです。
今回は、フィルタリング方式で指定した<fonr color="cyan">条件を配列で返してくれる</font>やり方です。

```python
[式 for 要素 in イテラブル if 条件]
```

##### 使い方

```python
# HogeListを使って、hoge_listにあるcount_testが3のものを取得
data = HogeList()
data.hoge_list.append(Hoge(0))
data.hoge_list.append(Hoge(1))
data.hoge_list.append(Hoge(2))
data.hoge_list.append(Hoge(3))
data.hoge_list.append(Hoge(4))

# 一致するデータを配列で取得 (*存在しなければ空の配列が返ってくる)
find_data_list = [item for item in data.hoge_list if item.count_test == 3]

# 一致するデータをインデックス配列で取得 (*存在しなければ空の配列が返ってくる)
find_index_list = [idx for idx, item in enumerate(data.hoge_list) if item.count_test == 3]

print("一致するデータ:", [item.count_test for item in find_data_list])  # 出力: [3]
print("一致するインデックス:", find_index_list)  # 出力: [3]
```

##### next関数
イテレーターから次の要素を取得できる関数(イテレーターとは、<font color="cyan">繰り返し処理を行う際に次の要素を指し示すためのポインタ</font>のようなもの﻿)
```python
next(第一引数,第二引数)
```
- 第一引数: 配列などを基本に入れる
- 第二引数: デフォルトの値を入れる(何も記載しなくても大丈夫)
##### 使い方

```python
# HogeListを使って、hoge_listにあるcount_testが3のものを取得
data = HogeList()
data.hoge_list.append(Hoge(0))
data.hoge_list.append(Hoge(1))
data.hoge_list.append(Hoge(2))
data.hoge_list.append(Hoge(3))
data.hoge_list.append(Hoge(4))

# データをそのまま取得する方法 (1つしか取れない) *存在しなければNoneが返ってくる
find_data = next((item for item in data.hoge_list if item.count_test == 3), None)

# インデックスを返す (1つしか取れない) *存在しなければ-1が返ってくる
find_index = next((idx for idx, item in enumerate(data.hoge_list) if item.count_test == 3), -1)

print("最初の一致するデータ:", find_data.count_test if find_data else "なし")  # 出力: 3
print("最初の一致するインデックス:", find_index)  # 出力: 3
```

### Delete系

#### リスト内包表記(重複削除)
リスト内包表記（List Comprehension）は、Pythonでリストを簡潔かつ効率的に生成するための強力なツールです。
今回は、フィルタリング方式で指定した<fonr color="cyan">条件を配列で返しSet関数を使って重複処理する</font>やり方です。

##### set関数

1. 重複を自動的に削除する :
   同じ値が複数存在しても、1つだけ保持されます。
   例えば、`{1, 2, 2, 3}` という set を作ると、結果は `{1, 2, 3}` になります。
 
2. 順序を持たない :
   set は要素の順序を保証しません。そのため、追加された順番とは異なる順序で要素が格納されることがあります。
 
3. 変更可能（ミュータブル） :
   要素の追加や削除が可能です。
 
4. ハッシュ可能な要素のみを格納できる :
   set の要素はハッシュ可能（hashable）である必要があります。つまり、整数、文字列、タプルなどのイミュータブルなオブジェクトは格納できますが、リストや辞書などのミュータブルなオブジェクトは格納できません。


###### 使い方
```python
# HogeListを使って、hoge_listにあるcount_testが重複するものを削除
data = HogeList()
data.hoge_list.append(Hoge(1))
data.hoge_list.append(Hoge(2))
data.hoge_list.append(Hoge(3))
data.hoge_list.append(Hoge(2))  # 重複を追加
data.hoge_list.append(Hoge(4))

# リスト内包表記で重複を削除（順序を保持）
seen = set()
unique_hoge_list = [item for item in data.hoge_list if not (item.count_test in seen or seen.add(item.count_test))]

# 結果を確認
for item in unique_hoge_list:
    print(f"count_test={item.count_test}")
```