Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで文字列から辞書(dict)を作成する2つの方法【eval()とジェネレータ式】

はじめに

Pythonプログラミングでは、「キー=値」のような形式で記述された文字列を、実際の辞書型(dict)オブジェクトへ変換したい場面がよくあります。この記事では、組み込み関数 dict() を直接使わずに文字列から辞書を作成する2つの方法を、具体的なコード例と実行結果とともに解説します。

問題の概要

課題: 文字列の入力が与えられるので、これを辞書型へ変換する必要があります。

ここでは、以下の2つのアプローチを取り上げます。

  • 方法1:eval() 関数を使う方法
  • 方法2:ジェネレータ式を使う方法

方法1:eval() 関数を使う

eval() 関数は、文字列の内容がそのまま辞書リテラルとして有効な構文である場合に利用できます。この条件を満たしていれば、文字列を直接辞書へ一発で変換可能です。

ただし、eval() は文字列をそのままPythonコードとして評価・実行するため、信頼できない入力に使うとコードインジェクションなどの重大なセキュリティリスクがあります。外部からの入力を扱う場合は、後述の方法2や、安全に評価できる ast.literal_eval() の利用を推奨します。

コード例

# 文字列
string = "{'T':1, 'U':2, 'T':3, 'O':4, 'R':5}"
# eval() 関数で変換
dict_string = eval(string)
print(dict_string)
print(dict_string['T'])

出力結果

{'T': 3, 'U': 2, 'O': 4, 'R': 5}
3

同じキー 'T' が複数回登場しているため、後から指定された値で上書きされている点にも注目してください。

方法2:ジェネレータ式を使う

文字列が「キー-値」のペアをカンマ区切りで並べた形式の場合、ジェネレータ式を活用すれば安全かつ柔軟に辞書へ変換できます。split() メソッドで各要素を分解し、strip() で余分な空白を除去しながら処理します。

コード例

string = "T-3 , U-2 , T-1 , O-4 , R-5"
# 文字列を辞書へ変換
dict_string = dict((x.strip(), y.strip()) for x, y in
(element.split('-') for element in string.split(', ')))
print(dict_string)
print(dict_string['T'])

出力結果

{'T': '1', 'U': '2', 'O': '4', 'R': '5'}
1

この方法では、すべての値が文字列として格納される点に注意が必要です。数値として扱いたい場合は、int(y) のように型変換を組み合わせるとよいでしょう。

まとめ

この記事では、文字列から辞書を作成する2つの方法を紹介しました。eval() を使う方法はシンプルですがセキュリティ上の注意が必須であり、一方でジェネレータ式を使う方法は入力形式に合わせた柔軟な変換が可能です。データの出所や形式に応じて、適切な手法を選択してください。

  1. Pythonで文字列からn番目の文字を削除する方法

    この記事では、「文字列から指定したインデックス(i番目)の文字を削除して表示する」という問題の解き方を解説します。 問題の概要 与えられた文字列から、指定されたインデックス位置にある1文字を取り除き、その結果を出力します。 Pythonでは文字列のインデックスは必ず0から始まる点に注意してください。たとえば「tutorialspoint」という文字列の場合、各文字とインデックスの対応は以下のようになります。 T u t o r i a l s p o i n t 0 1 2 3 4 5 6 7 8 9 10 11 12 13 それでは、この問題を解くためのPythonスクリプトを見ていきましょ

  2. Pythonで文字列からn番目の文字を削除するプログラムの書き方

    はじめにこの記事では、以下の問題に対する解決方法を解説します。問題文 − 与えられた文字列から、指定したインデックス(i番目)の文字を削除し、その結果を表示します。Pythonの文字列では、インデックスは必ず0から始まるという点に注意してください。例えば、「Tutorialspoint」という文字列の場合、各文字のインデックスは以下のように対応しています。T u t o r i a l s p o i n t 0 1 2 3 4 5 6 7 8 9 10 11 12 13それでは、この問題を解決するためのPythonスクリプトを見ていきましょう。実装例def remove(string