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

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

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

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

Q&A

解決済

1回答

296閲覧

ネストが深い辞書のバリューを入れ替えたい

kaitotokai

総合スコア59

Python

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

0グッド

1クリップ

投稿2018/04/27 02:52

前提・実現したいこと

ネストが深い辞書のバリューを入れ替えたい。

{"a1":[["100","150"],["140","120"],["130","110"],["140","140"]],"b1":[["2","4"],["3","5"]],"c1":[["90","40"],["80","50"]]}

という辞書dfがある。
この辞書を

{"a1":[0.04,0.05],"b1":[0.05],"c1":[0.03]}

という形に変形したい。

発生している問題・エラーメッセージ

辞書の中身が変わらない

該当のソースコード

for key, value in dct.items(): for k,y in value.items(): trans = np.reshape(y, (-1, 2, 2)) ans = A(*trans) y = ans

のように入れ替えようとしたが、バリューは入れ替わらなかった。

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

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

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

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

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

hayataka2049

2018/04/27 02:56

どんな変換をするのか(Aの中身は何か)教えてください
kaitotokai

2018/04/27 03:00

Aは[["100","150"],["140","120"]]を引数に受け取る関数で、0.04などの少数に計算して値を返すメソッドです
hayataka2049

2018/04/27 03:06

b1, c1の値はその形式になっていますが、a1は[["100","150"],["140","120"],["130","110"],["140","140"]]でそのまま渡せません。どう取り扱うのでしょうか
kaitotokai

2018/04/27 03:09

trans = np.reshape(y, (-1, 2, 2))で、[["100","150"],["140","120"]]、[["130","110"],["140","140"]]に変換しています
guest

回答1

0

ベストアンサー

こんな感じで良いでしょうか。

python

1from pprint import pprint 2import numpy as np 3 4def A(*args): 5 # 確認用 6 return ["{0}:{1}:{2}:{3}".format( 7 x[0][0], x[0][1], 8 x[1][0], x[1][1]) for x in args] 9 10dct = {"a1":[["100","150"],["140","120"],["130","110"],["140","140"]],"b1":[["2","4"],["3","5"]],"c1":[["90","40"],["80","50"]]} 11 12dct = {k:A(*np.reshape(v, (-1, 2, 2))) for k,v in dct.items()} 13pprint(dct) 14""" #=> 15{'a1': ['100:150:140:120', '130:110:140:140'], 16 'b1': ['2:4:3:5'], 17 'c1': ['90:40:80:50']} 18""" 19

投稿2018/04/27 03:37

hayataka2049

総合スコア30933

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

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

kaitotokai

2018/04/27 04:03

ありがとうございます。vが2で割り切れる時という条件をつけるときは、内包表記はどのような形になりますか? dct = {k:A(*np.reshape(v, (-1, 2, 2))) if len(v) %2 == 0 for k,v in dct.items()} と書いたのですが、SyntaxError: invalid syntaxとエラーが出て、うまくいかなくて
kaitotokai

2018/04/27 04:08

すみません、できました。ありがとうございます!
hayataka2049

2018/04/27 04:10

リストを割り切るという演算が私には理解できないので、説明してください len(v)なら、 dct = {k:A(*np.reshape(v, (-1, 2, 2))) for k,v in dct.items() if len(v) %2 == 0} ですが・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問