CodeGym /コース /Python SELF JA /ループと辞書のジェネレーター

ループと辞書のジェネレーター

Python SELF JA
レベル 11 , レッスン 6
使用可能

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}という表現は、実際には両方の辞書の要素を統合します。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION