質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

8363閲覧

python、dict関数で引数に変数を代入するには?

kankan0

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/30 19:47

次のようなdict関数を用いて文字列を辞書化するコードがある時、
引数に変数を用いるとエラーになってしまいます。

python

1tes = "__cd='d40000', ipip='2769419', dhash='3925fd', ss='dzze', eve='15671'" 2print(dict(tes))

結果
ValueError: dictionary update sequence element #0 has length 1; 2 is required

ただし、このように引数に変数を用いず、直接入力した時には上手くいきました。

python

1print(dict(__cd='d40000', ipip='2769419', dhash='3925fd', ss='dzze', eve='15671'))

結果
{'__cd': 'd40000', 'ipip': '2769419', 'dhash': '3925fd', 'ss': 'dzze', 'eve': '15671'}

引数に変数を用いる場合についてどう修正すべきか教えて下さい。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

dict関数では文字列を辞書化することはできません。
正規表現を使ってパースすることで以下のように辞書化できます。

Python

1tes = "__cd='d40000', ipip='2769419', dhash='3925fd', ss='dzze', eve='15671'" 2 3l = re.findall( r"(.+?)\=\s*'(.*?)'\s*,*", tes) 4 5ret = {v[0].strip():v[1] for v in l} 6print(ret) # {'__cd': 'd40000', 'ipip': '2769419', 'dhash': '3925fd', 'ss': 'dzze', 'eve': '15671'}

追記

なお、辞書のキーと値を変数とその値として定義するには以下のようにすればよいです。
参考:convert dictionary entries into variables - python

Python

1# 辞書→変数に 2locals().update(ret) 3print(__cd) # d40000

投稿2019/08/30 20:38

編集2019/08/31 00:07
can110

総合スコア38234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

引数に変数を...という表現が引っかかりますが、その方針で辞書を作りたいなら eval を使うという手もあるかもしれません。

Python

1tes = "__cd='d40000', ipip='2769419', dhash='3925fd', ss='dzze', eve='15671'" 2print(eval("dict({})".format(tes)))

ただし tes の中身についてバリデーションを行ったりするべき...など考えるとあまりお勧めできません。

投稿2019/08/30 22:34

namnium1125

総合スコア2043

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kankan0

2019/09/01 12:48

ありがとうございます。 引数に変数を・・・という言葉の表現は間違っていますか? 初心者なもので、もし理解がおかしければ教えて下さい。 私もevalという関数を使おうかとも思ったのですが、セキュリティ的な観点でお勧めできない、というような記述もありました。使うべきではないのでしょうか?
namnium1125

2019/09/01 13:00 編集

そもそも質問の目的がよくわからないです。test = {"__cd":'d40000', "ipip":'2769419', "dhash":'3925fd', "ss":'dzze', "eve":'15671'} みたいに直接辞書を作るのではなく、「文字列から」作成する理由がわかりません。何かしらのファイルを読み込むならそれ専用の機能を持ってくるなり作るなりするべきです。
namnium1125

2019/09/01 13:00

そして、「技術的に可能か」と聞かれればevalが答えでしょう。具体的にどのようなシーンで困っているかわからない以上、これ以上の適切なアドバイスは難しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問