【Python入門】リストの一意な値ごとにIDを割り当てる2つの方法
Pythonでリストを扱っていると、各要素を一意に識別したい場面が出てきます。たとえば、データのカテゴリ化やラベルエンコーディングなどでは、同じ値には同じIDを、異なる値には異なるIDを割り当てる必要があります。
本記事では、リスト内の重複する要素に対して同じIDを割り当て、一意な値ごとに連番のIDを振る方法を、2つのアプローチでわかりやすく解説します。
方法1:enumerate()とOrderedDict.fromkeys()を組み合わせる
まず紹介するのは、enumerate()関数とOrderedDict.fromkeys()を組み合わせる方法です。
enumerate()は、リストの各要素に連番(カウンター)を付与する関数です。さらにOrderedDict.fromkeys()を使うことで、リストから重複を除去しつつ元の順序を保持した辞書を作成できます。この2つを組み合わせることで、「同じ値には同じID」という対応関係を簡単に実現できます。
コード例
from collections import OrderedDict
Alist = ['Mon','Tue','Wed','Mon',5,3,3]
print("元のリスト : ", Alist)
# 値にIDを割り当てる
list_ids = [{v: k for k, v in enumerate(
OrderedDict.fromkeys(Alist))}
[n] for n in Alist]
# 結果を表示
print("IDのリスト : ", list_ids)実行結果
上記のコードを実行すると、次のような出力が得られます。
元のリスト : ['Mon', 'Tue', 'Wed', 'Mon', 5, 3, 3] IDのリスト : [0, 1, 2, 0, 3, 4, 4]
出力を見ると、最初に出現した「Mon」には0が割り当てられ、4番目に再登場した「Mon」にも同じ0が割り当てられていることがわかります。同様に「3」にも同じID(4)が付与されています。
方法2:collectionsのdefaultdictを使う
次に紹介するのは、collectionsモジュールのdefaultdictを使う方法です。
defaultdictは、存在しないキーにアクセスしたときに自動的にデフォルト値を生成してくれる辞書型です。ここでは「新しい要素に出会ったときだけ、現在の辞書の長さをIDとして登録する」というラムダ式を活用します。これにより、初登場の要素には順に0, 1, 2...とIDが振られ、既出の要素には登録済みのIDがそのまま返されます。
コード例
from collections import defaultdict
# 元のリスト
Alist = ['Mon','Tue','Wed','Mon',5,3,3]
print("元のリスト : ", Alist)
# 値にIDを割り当てる
d_dict = defaultdict(lambda: len(d_dict))
list_ids = [d_dict[n] for n in Alist]
# IDのリストを表示
print("IDのリスト : ", list_ids)実行結果
上記のコードを実行すると、次のような出力が得られます。
元のリスト : ['Mon', 'Tue', 'Wed', 'Mon', 5, 3, 3] IDのリスト : [0, 1, 2, 0, 3, 4, 4]
まとめ
どちらの方法でも、リストの一意な値ごとに重複のないIDを割り当てることができました。
- enumerate() + OrderedDict.fromkeys():辞書内包表記で一気に変換する、簡潔なワンライナー的な書き方。
- defaultdict:ラムダ式で「新規要素のみIDを採番」する仕組みが直感的で、可読性が高い書き方。
機械学習におけるラベルエンコーディングなどでも応用できるテクニックなので、ぜひ使いこなせるようにしておきましょう。
-
Pythonで整数リストの各要素に値Kを加算する3つの方法
データ分析では、新しいシナリオの結果を判断するために、Pythonリストの各要素に特定の値を加算する必要がある場面があります。これにより、異なる値を与えた場合にデータセットがどのように振る舞うかを複数のシナリオでテストでき、そうした状況に対応できるモデルやアルゴリズムの構築につながります。本記事では、リストの全要素に同じ値を加算するための代表的な3つの手法を、具体的なコード例とともに解説します。方法1:リスト内包表記を使うリスト内包表記は、リストの各要素をループ処理する際にもっとも広く使われる簡潔な書き方です。以下の例では、シンプルなforループの構文でリストの各要素に同じ数値を加算しています
-
Pythonでリストの各サブリストに新しい要素を追加する方法
Pythonのプログラミングでは、既存のリストに対して新しい値を追加したい場面がよくあります。特に、ネストされたリスト(リストの中にリストが入った構造)の各サブリストに、同じ値や複数の値を一括して追加する方法は、データ処理において非常に便利です。本記事では、既存のリストの各要素(サブリスト)と新しい値を組み合わせて挿入するための、2つの代表的な手法をわかりやすく解説します。方法1:リスト内包表記(forループ)を使うすべてのサブリストが同じ長さを持っている場合は、リスト内包表記を使うことで、簡潔に新しい値を各サブリストへ追加できます。アンパック(展開)を利用することで、コードが読みやすくなるの