6.1 enumerate()
の使い方
以前、辞書のkeys
, values
, items
についてのループを扱いました。今回はenumerate()
関数を詳しく見てみましょう。
enumerate()
関数は辞書の要素をループする際に、インデックス、キー、および値にアクセスできるので便利です。
以下は辞書でenumerate()
を使う例です:
インデックス付きで辞書のキーと値をループする
enumerate()
を使ってキーと値をインデックス付きでループできます。
# 人のデータを持つ辞書
person = {"name": "Alice", "age": 25, "city": "New York"}
# インデックス付きで辞書のキーと値をループ
for index, (key, value) in enumerate(person.items()):
print(f"インデックス: {index}, キー: {key}, 値: {value}")
# 各辞書要素のインデックス、キー、値を出力
出力:
インデックス: 0, キー: name, 値: Alice
インデックス: 1, キー: age, 値: 25
インデックス: 2, キー: city, 値: New York
インデックスを使って辞書の値を変換する
enumerate()
を使って、インデックスに基づいて辞書の値を変更することができます。
# 元の辞書
person = {"name": "Alice", "age": 25, "city": "New York"}
# 新しい辞書にインデックスを付けた値
indexed_person = {}
for index, (key, value) in enumerate(person.items()):
indexed_person[key] = f"{value}_{index}"
# 辞書の値にインデックスを文字列として割り当て
print(indexed_person)
# インデックスを値に追加した辞書を出力
出力:
{'name': 'Alice_0', 'age': '25_1', 'city': 'New York_2'}
インデックスをキーとして新しい辞書を作成するためにenumerate()
を使用
enumerate()
を使って新しい辞書を作成し、インデックスをキーとして使用できます。
# 元の辞書
person = {"name": "Alice", "age": 25, "city": "New York"}
# インデックスをキーとして使用する新しい辞書
indexed_person = {index: (key, value) for index, (key, value) in enumerate(person.items())}
print(indexed_person)
# インデックスをキーとして持つ新しい辞書を出力
出力:
{0: ('name', 'Alice'), 1: ('age', 25), 2: ('city', 'New York')}
6.2 辞書のジェネレーター
既にリスト内包表記を使ってリストを、セット内包表記を使ってセットを生成しました。同様に、ジェネレーター構文を使って辞書を作成できます。 Dictionary Comprehensions(辞書のジェネレーター)は、より簡潔で読みやすいコードを書いて辞書を生成するのに役立ちます。
基本的なdictionary comprehensionの構文は次のようになります:
{式1: 式2 for 変数 in シーケンス if 条件}
ここで
-
変数
— イテラブルオブジェクトからそれぞれの要素の値を受け取る変数。 -
シーケンス
— 該当する変数を経由する(例えば、リスト、タプル、文字列などの)イテラブルオブジェクト。 -
式1
— 辞書のキーを生成するための式。通常は変数に依存する。 -
式2
— 辞書の値を生成するための式。 -
条件
—(オプション)辞書に要素を含めるために実行されるべき条件。
例1:
数の平方とする辞書の作成
# 1から5までの数をキーとし、その平方を値とする辞書の作成
squares = {x: x ** 2 for x in range(1, 6)}
print(squares) # 出力: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
例2:
タプルのリストから辞書を作成
# キーと値のペアを含むタプルのリスト
pairs = [("name", "Alice"), ("age", 25), ("city", "New York")]
# タプルのリストから辞書を生成
person = {key: value for key, value in pairs}
print(person) # 出力: {'name': 'Alice', 'age': 25, 'city': 'New York'}
例3:
辞書を作成する際の要素フィルタリング
# 1から10までの数をキーとし、その平方を値とする辞書を作成
# 偶数のみ
even_squares = {x: x ** 2 for x in range(1, 11) if x % 2 == 0}
print(even_squares) # 出力: {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}
例4:
辞書を作成する際の要素変換
# 文字列のリスト
words = ["apple", "banana", "cherry"]
# 文字列をキーとし、その長さを値とする辞書を生成
word_lengths = {word: len(word) for word in words}
print(word_lengths) # 出力: {'apple': 5, 'banana': 6, 'cherry': 6}
ネストされたdictionary comprehensions
# キーと値のペアを含むネストされたリスト
nested_pairs = [[("a", 1), ("b", 2)], [("c", 3), ("d", 4)]]
# ネストされたリストから辞書を生成
nested_dict = {key: value for sublist in nested_pairs for key, value in sublist}
print(nested_dict) # 出力: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
組み合わせた方法
複雑なケースでは、異なる方法を組み合わせて辞書を作成することができます。
# 複数の辞書を1つに統合
dict1 = {"name": "John", "age": 30}
dict2 = {"city": "New York", "country": "USA"}
combined_dict = {**dict1, **dict2}
print(combined_dict) # 出力: {'name': 'John', 'age': 30, 'city': 'New York', 'country': 'USA'}
オペレーター**
を辞書の名前の前に置くことで、その要素をまるで列挙されたように分解できます。このため、{**dict1, **dict2}
という表現は、実際には両方の辞書の要素を統合します。
GO TO FULL VERSION