Pythonでプログラミングを行っていると、データの形式を変換する必要に迫られる場面は数多くあります。特にリスト(list)と辞書(dict)の相互変換は、データ処理の現場で頻繁に登場する重要なテクニックでしょう。
リストは順序付きのデータ集合として扱いやすい一方、辞書はキーと値のペアでデータを管理できるため、用途に応じて使い分けが必要です。しかし、いざ変換しようとすると「どの関数を使えばいいのか」「複数のリストをどうやって辞書にするのか」といった疑問が湧いてくるかもしれません。
本記事では、Pythonにおけるlistとdictの変換方法を体系的に解説していきます。zip関数やdict関数を使った基本的な変換から、リスト内包表記を活用した応用テクニック、さらには辞書からリストへの逆変換まで、実践的なコード例とともに詳しくご紹介しましょう。
listとdictの変換方法の基本パターン
それではまず、リストと辞書の変換における基本的なパターンについて解説していきます。
zip関数を使った変換
Pythonでリストを辞書に変換する最も一般的な方法が、zip関数とdict関数を組み合わせるアプローチです。zip関数は複数のイテラブルオブジェクトを受け取り、それらの要素をペアにして返してくれます。
2つのリストがある場合、一方をキー、もう一方を値として辞書を作成できるでしょう。この方法は直感的で読みやすく、実務でも非常によく使われるパターンです。
keys = ['name', 'age', 'city']
values = ['山田太郎', 30, '東京']
# zip関数とdict関数で辞書を作成
result = dict(zip(keys, values))
print(result)
# 出力: {'name': '山田太郎', 'age': 30, 'city': '東京'}
dict関数による辞書化
dict関数は、さまざまな形式のデータを辞書に変換する汎用的な関数です。タプルのリストやペアになった要素を持つイテラブルを受け取ることができます。
リスト内の各要素が2要素のタプルやリストになっている場合、それらを直接dict関数に渡すだけで辞書化が可能でしょう。この方法はデータがすでにペア形式になっている場合に特に便利です。
# ペアのリストから辞書を作成
pairs = [('apple', 100), ('banana', 80), ('orange', 120)]
fruit_prices = dict(pairs)
print(fruit_prices)
# 出力: {'apple': 100, 'banana': 80, 'orange': 120}
変換時の注意点
リストを辞書に変換する際には、いくつか注意すべき点があります。最も重要なのは、辞書のキーは一意でなければならないという制約です。
同じキーが複数存在する場合、後から登場した値で上書きされてしまいます。また、キーとして使用できるのはハッシュ可能なオブジェクト(文字列、数値、タプルなど)に限られるため、リストや辞書自体をキーにすることはできません。
2つのリストから辞書を作成する方法
続いては、複数のリストを組み合わせて辞書を作成する具体的な方法を確認していきます。
zip関数の基本的な使い方
zip関数は、複数のイテラブルを並列で処理する際の強力なツールです。2つのリストを引数として渡すと、それぞれの同じ位置にある要素をペアにしたイテレータを返してくれるでしょう。
このzip関数の戻り値をdict関数に渡すことで、一方のリストをキー、もう一方を値とする辞書が簡単に作成できます。コードも非常にシンプルで可読性が高いのが特徴です。
# 商品名と価格のリストから辞書を作成
products = ['ノートPC', 'マウス', 'キーボード', 'モニター']
prices = [89800, 2980, 5800, 32000]
product_dict = dict(zip(products, prices))
print(product_dict)
# 出力: {'ノートPC': 89800, 'マウス': 2980, 'キーボード': 5800, 'モニター': 32000}
キーと値のペア作成
実際のデータ処理では、リストの要素を加工しながら辞書を作成したい場面もあるでしょう。zip関数を使いつつ、リスト内包表記と組み合わせることで、より柔軟な辞書作成が可能になります。
例えば、インデックス番号をキーにしたい場合や、値に何らかの計算を施したい場合などに有効です。以下の表は、よく使われる変換パターンをまとめたものです。
| 変換パターン | 使用する関数・メソッド | 用途 |
|---|---|---|
| 2つのリスト → 辞書 | zip() + dict() | キーと値のリストを結合 |
| リストのインデックス → 辞書 | enumerate() + dict() | インデックスをキーにする |
| ペアのリスト → 辞書 | dict() | タプルリストを直接変換 |
| 辞書 → リスト | list() + items() | 辞書をペアのリストに |
長さが異なるリストの扱い
zip関数を使用する際に気をつけたいのが、リストの長さが異なる場合の挙動です。標準のzip関数は、最も短いリストの長さに合わせて処理を終了します。
データの欠損を許容できない場合は、事前にリストの長さを確認するか、itertoolsモジュールのzip_longest関数を使用する方法があります。zip_longest関数を使えば、長い方のリストに合わせて処理を継続でき、足りない部分には指定した値(デフォルトはNone)を埋めてくれるでしょう。
from itertools import zip_longest
keys = ['a', 'b', 'c', 'd']
values =
# keysより短い
# 通常のzip関数の場合
normal_dict = dict(zip(keys, values))
print(normal_dict)
# 出力: {'a': 1, 'b': 2, 'c': 3} # 'd'が欠落
# zip_longestを使った場合
full_dict = dict(zip_longest(keys, values, fillvalue=0))
print(full_dict)
# 出力: {'a': 1, 'b': 2, 'c': 3, 'd': 0}
リスト内包表記を使った変換テクニック
次に、より高度な変換テクニックとして、リスト内包表記を活用した方法を見ていきましょう。
enumerate関数との組み合わせ
enumerate関数は、リストの要素とそのインデックスを同時に取得できる便利な関数です。これを辞書内包表記と組み合わせることで、インデックスをキーとした辞書を簡潔に作成できます。
データの順序情報を保持しながら辞書化したい場合や、後でインデックスベースでアクセスする必要がある場合に重宝するでしょう。
fruits = ['りんご', 'みかん', 'ぶどう', 'いちご']
# enumerateを使ってインデックスをキーにした辞書を作成
indexed_dict = {i: fruit for i, fruit in enumerate(fruits)}
print(indexed_dict)
# 出力: {0: 'りんご', 1: 'みかん', 2: 'ぶどう', 3: 'いちご'}
# インデックスを1から始める場合
indexed_dict_from_1 = {i+1: fruit for i, fruit in enumerate(fruits)}
print(indexed_dict_from_1)
# 出力: {1: 'りんご', 2: 'みかん', 3: 'ぶどう', 4: 'いちご'}
条件付き変換の実装
辞書内包表記では、if文を使った条件フィルタリングも可能です。特定の条件を満たす要素だけを辞書に含めたり、値を条件によって変更したりできるでしょう。
この方法を使えば、データのクリーニングや加工を変換と同時に行えるため、コードの効率が大幅に向上します。
numbers =
# 偶数のみを辞書に含める
even_dict = {f'num_{n}': n for n in numbers if n % 2 == 0}
print(even_dict)
# 出力: {'num_2': 2, 'num_4': 4, 'num_6': 6, 'num_8': 8, 'num_10': 10}
# 値を条件によって変換
scored_dict = {n: '合格' if n >= 60 else '不合格' for n in [45, 78, 82, 53, 91]}
print(scored_dict)
# 出力: {45: '不合格', 78: '合格', 82: '合格', 53: '不合格', 91: '合格'}
ネストしたリストからの辞書作成
二次元リストや、より複雑な構造を持つデータから辞書を作成する場合も、リスト内包表記が活躍します。各要素が複数の値を持つリストの場合、それらを適切に展開して辞書化できるでしょう。
# 各要素が[名前, 年齢, 職業]のリスト
person_data = [
['田中', 28, 'エンジニア'],
['佐藤', 35, 'デザイナー'],
['鈴木', 42, 'マネージャー']
]
# 名前をキーにした辞書を作成
person_dict = {data[0]: {'age': data
, 'job': data
} for data in person_data}
print(person_dict)
# 出力: {'田中': {'age': 28, 'job': 'エンジニア'},
# '佐藤': {'age': 35, 'job': 'デザイナー'},
# '鈴木': {'age': 42, 'job': 'マネージャー'}}
辞書からリストへの逆変換方法
ここからは、辞書をリスト形式に変換する方法について確認していきます。
keys()とvalues()メソッドの活用
辞書からリストへの変換で最も基本的なのが、keys()メソッドとvalues()メソッドの利用です。keys()メソッドは辞書のすべてのキーを、values()メソッドはすべての値を取得できます。
これらのメソッドが返すのはビューオブジェクトですが、list関数でラップすることで通常のリストに変換できるでしょう。データの一部だけを抽出したい場合に便利です。
student_scores = {
'山田': 85,
'田中': 92,
'佐藤': 78,
'鈴木': 88
}
# キーのリストを取得
students = list(student_scores.keys())
print(students)
# 出力: ['山田', '田中', '佐藤', '鈴木']
# 値のリストを取得
scores = list(student_scores.values())
print(scores)
# 出力: [85, 92, 78, 88]
items()メソッドでのペア取得
キーと値の両方を保持したままリスト化したい場合は、items()メソッドが適しています。このメソッドは、キーと値のタプルを返すため、それをリスト化すればペアのリストが得られるでしょう。
この形式は、後で再度辞書に戻す必要がある場合や、データをそのまま保存したい場合に役立ちます。
config = {
'host': 'localhost',
'port': 8080,
'debug': True
}
# キーと値のペアのリストを取得
config_list = list(config.items())
print(config_list)
# 出力: [('host', 'localhost'), ('port', 8080), ('debug', True)]
# このリストから辞書に戻すことも可能
restored_config = dict(config_list)
print(restored_config)
# 出力: {'host': 'localhost', 'port': 8080, 'debug': True}
リスト形式への変換パターン
辞書からリストへの変換には、用途に応じてさまざまなパターンがあります。以下の表は、代表的な変換パターンをまとめたものです。
| 変換内容 | メソッド | 結果の形式 |
|---|---|---|
| キーのみ取得 | list(dict.keys()) | [‘key1’, ‘key2’, …] |
| 値のみ取得 | list(dict.values()) | [value1, value2, …] |
| キーと値のペア | list(dict.items()) | [(‘key1’, value1), (‘key2’, value2), …] |
| 特定の条件でフィルタ | リスト内包表記 | 条件に応じた任意の形式 |
より複雑な変換が必要な場合は、リスト内包表記を使って柔軟に対応できます。例えば、特定の条件を満たすキーだけを抽出したり、値を加工しながらリスト化したりすることが可能でしょう。
inventory = {
'apple': 50,
'banana': 0,
'orange': 30,
'grape': 0,
'melon': 15
}
# 在庫がある商品のみリスト化
in_stock = [item for item, quantity in inventory.items() if quantity > 0]
print(in_stock)
# 出力: ['apple', 'orange', 'melon']
# 商品名と在庫数を文字列で結合したリスト
stock_info = [f'{item}: {quantity}個' for item, quantity in inventory.items()]
print(stock_info)
# 出力: ['apple: 50個', 'banana: 0個', 'orange: 30個', 'grape: 0個', 'melon: 15個']
まとめ
本記事では、Pythonにおけるlistとdictの相互変換方法について詳しく解説してきました。
リストから辞書への変換では、zip関数とdict関数の組み合わせが最も基本的で実用的な方法です。2つのリストをキーと値のペアとして結合でき、シンプルなコードで実現できるでしょう。
リスト内包表記を活用すれば、enumerate関数との組み合わせでインデックスベースの辞書を作成したり、条件付きフィルタリングを行いながら変換したりと、より高度な処理が可能になります。
逆に辞書からリストへの変換では、keys()、values()、items()といったメソッドを使い分けることで、必要なデータ形式に柔軟に対応できます。
これらの変換テクニックを理解し使いこなすことで、データ処理の効率が大きく向上するはずです。状況に応じて適切な方法を選択し、読みやすく保守性の高いコードを書いていきましょう。