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

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

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

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

Q&A

2回答

2347閲覧

階層の深い辞書を1段に変換する問題

kingsma20576829

総合スコア11

Python

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

0グッド

0クリップ

投稿2018/08/29 10:15

編集2022/01/12 10:55

Pythonの問題について、自分で答えを考えてみたのですが、エラーになってします。
どこを直せばよいか教えて下さい。
【問題】
辞書の中の辞書の中の辞書、のように階層の深い辞書 target を1段の辞書に変換する関数を書きましょう。
separator 文字列を使って、各階層のキーを繋げます。

入力例:

target: {"foo": {"bar": "baz"}, "hoge": "fuga"}
separator: "_"
出力

{"foo_bar": "baz", "hoge": "fuga"}

【自分の解答】

Python

1def dict_flatten(target, separator): 2 new_dic = {} 3 for key, value in target.items(): 4 print(key, value) 5 while not type(value) == str: 6 key1, value = value.items() 7 key = key + separator + key1 8 new_dic[key] = value

6行目にnot enough values to unpack (expected 2, got 1)とエラーが出ます。
items()関数でvalueを更新していき、文字列になったら終了するという方針です。
itmes()関数を使う2回目以降は、valueは辞書型でないのでしょうか?

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

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

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

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

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

guest

回答2

0

dict.items()が返すジェネレータは[(key1, value1), (key2, value2), ...]という構造なので、その代入でキーと値に分けることはできない(正確にはシーケンスアンパックの数が合わない)というエラーです。


やっぱりこういうのは再帰で書きたいな、ということで。

python

1target = {"foo": {"bar": "baz", "hogehoge": {"foofoo": "bazbaz"}}, "hoge": "fuga"} 2# mkgreiさん`target`をお借りしました。 3print(target) 4 5def dict_flatten(d, pref_key="", sep="_", result=None): 6 if result is None: 7 result = {} 8 for k,v in d.items(): 9 if isinstance(v, dict): 10 dict_flatten(v, pref_key=pref_key+k+sep, sep=sep, result=result) 11 else: 12 result[pref_key+k] = v 13 return result 14 15print(dict_flatten(target)) 16

投稿2018/08/29 12:03

編集2018/08/29 23:48
hayataka2049

総合スコア30933

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

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

0

コードぽん。

python

1target = {"foo": {"bar": "baz", "hogehoge": {"foofoo": "bazbaz"}}, "hoge": "fuga"} 2print(target) 3 4while any([type(v) is dict for v in target.values()]): 5 plain = {k:v for k, v in target.items() if type(v) is not dict} 6 nested = [{f'{k}_{kk}': vv for kk, vv in v.items()} for k, v in target.items() if type(v) is dict] 7 for d in nested: 8 plain.update(d) 9 target = plain 10 11print(target)

投稿2018/08/29 15:28

mkgrei

総合スコア8560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問