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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

Q&A

解決済

2回答

1410閲覧

Pythonで辞書型からソートしたデータをリストに入れる方法に関するエラー

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

0グッド

0クリップ

投稿2018/07/13 06:18

前提・実現したいこと

前回の質問でいただいた回答を通して
Pythonで辞書型からソートしたデータをリストに入れる方法について学んだのですが、
入力するデータを変更したところ、エラーが発生してしまい、それを修正する方法を探しています。

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

以下のエラーが発生しており、コードの

print(f'{outer_key}:') for k, v in inner_sorted_items[:1]: print(f'- {k}')

の部分で確認したところ、
outer_keyはあってもkのない組み合わせ(例えば('Tokyo', ' '))があるようで、
リストの格納時にエラーが起きている可能性があるというところまではたどり着きましたが、
その後の具体的な修正方法がわかりません。

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-42-5a1a7432f6fe> in <module>() 1 ret = [] 2 for outer_key, inner_dict in words_matrix.items(): ----> 3 max_k = max(inner_dict, key=inner_dict.get) # 値が最大をとるキーを返す 4 ret.append((outer_key,max_k)) 5 print(ret) ValueError: max() arg is an empty sequence

該当のソースコード

python

1#前回 words_matrix = {'Tokyo': {'Shinjuku': 0.9, 'Ginza': 0.98, 'Shibuya':0.7}, 'Kanagawa':{'Yokohama': 0.88, 'Kamakura': 0.9, 'Minatomirai':0.66}} 2 3#同じ形式で追加のデータを加えた 4words_matrix = {'Tokyo': {'Shinjuku': 0.9, 'Ginza': 0.98, 'Shibuya':0.7}, 'Kanagawa':{'Yokohama': 0.88, 'Kamakura': 0.9, 'Minatomirai':0.66 ...}} 5 6 7import operator 8for outer_key, inner_dict in words_matrix.items(): 9 inner_sorted_items = sorted( 10 inner_dict.items(), 11 reverse=True, 12 key=operator.itemgetter(-1) 13 ) 14 15 print(f'{outer_key}:') 16 for k, v in inner_sorted_items[:1]: 17 print(f'- {k}') 18 19ret = [] 20for outer_key, inner_dict in words_matrix.items(): 21 max_k = max(inner_dict, key=inner_dict.get) # 値が最大をとるキーを返す 22 ret.append((outer_key,max_k)) 23print(ret)

補足情報(FW/ツールのバージョンなど)

python 3.6.3

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

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

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

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

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

guest

回答2

0

words_matrix = {'OK':{'a': 0.88, 'b': 0.9},'Error':{}}のように、辞書に要素がないケースに再現します。
ループ中にてinner_dictの要素数が1個以上の場合のみに処理(max、append)すればよいです。
具体的なコードは難しくないのでご自身でお考え下さい。

投稿2018/07/13 06:29

can110

総合スコア38256

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

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

退会済みユーザー

退会済みユーザー

2018/07/13 09:44

ご回答いただきましてありがとうございました。
guest

0

ベストアンサー

前以て弾いておけば良いだけでは。

Python

1ret = [] 2for outer_key, inner_dict in words_matrix.items(): 3 if not inner_dict: 4 continue 5 6 max_k = max(inner_dict, key=inner_dict.get) # 値が最大をとるキーを返す 7 ret.append((outer_key,max_k)) 8 print(ret)

投稿2018/07/13 06:26

LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2018/07/13 09:44

ご回答いただきましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問