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

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

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

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

Q&A

解決済

2回答

3039閲覧

リストの中に入っている辞書をまとめて処理したい。

hacosato

総合スコア48

Python 3.x

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

1グッド

0クリップ

投稿2016/10/23 09:49

編集2016/10/23 09:51

###前提・実現したいこと
Python3で、3つの文書に含まれる漢字、ひらがな、カタカナの数を数えました。
文書ごとに辞書にしたものをリストにまとめて、resultという変数にまとめました(ここまではできた)。

この3つの文書に含まれる漢字、ひらがな、カタカナの数の平均を求めて辞書にしたいです(ここができない)。

###該当のソースコード

Python3

1import statistics 2 3result = [{'kanji': 106, 'hiragana': 227, 'katakana': 25}, {'kanji': 56, 'hiragana': 188, 'katakana': 36}, {'kanji': 106, 'hiragana': 274, 'katakana': 8}] 4for item in (zip(result[0].values(), result[1].values(), result[2].values())): 5 print(statistics.mean(item))

こういうふうに出力されます。

89.33333333333333 229.66666666666666 23.0

近いところまで来ましたが、これだと

  • 文書の数が増えたら書き直さないといけない。
  • 結果を辞書にまとめたいのにできない(キーを手打ちしないといけない?)。

という問題があります。

本当は

{'kanji': 89.33333333333333, 'hiragana': 229.66666666666666, 'katakana': 23.0}

こういうのが欲しいです。

zipのところを内包表記にするのかな?と思いますが、うまくいきません。
いいやり方があれば教えていただきたいです!

ここにはじめて来ました! 今後ともよろしくお願いします♪

toritoritorina👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんな感じでどうですか。

python

1import statistics 2 3result = [ 4 {'kanji': 106, 'hiragana': 227, 'katakana': 25}, 5 {'kanji': 56, 'hiragana': 188, 'katakana': 36}, 6 {'kanji': 106, 'hiragana': 274, 'katakana': 8}, 7] 8 9# ['kanji', 'hiragana', 'katakana'] 10keys = [key for key in result[0].keys()] 11 12# [89.33333333333333, 229.66666666666666, 23] 13values = [statistics.mean(d[key] for d in result) for key in keys] 14 15# {'hiragana': 229.66666666666666, 'kanji': 89.33333333333333, 'katakana': 23} 16means_dict = {key: value for key, value in zip(keys, values)} 17print(means_dict)

valuesは、内包表記を使わないと以下のようなループになります。

python

1values = [] 2for key in keys: 3 number_list = [] 4 for d in result: 5 number_list.append(d[key]) 6 mean = statistics.mean(number_list) 7 values.append(mean)

ワンライナーで書くと、以下のようになります。

python

1import statistics 2result = [{'kanji': 106, 'hiragana': 227, 'katakana': 25}, {'kanji': 56, 'hiragana': 188, 'katakana': 36}, {'kanji': 106, 'hiragana': 274, 'katakana': 8}] 3print({key: statistics.mean(d[key] for d in result) for key in result[0].keys()})

投稿2016/10/23 13:13

編集2016/10/24 19:55
toritoritorina

総合スコア972

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

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

hacosato

2016/10/24 15:59

ありがとうございます! values = [statistics.mean(d[key] for d in result) for key in keys] この部分がぴんときません…。forがふたつあるので頭が混乱します…。 しばらくプログラミングに時間を割けないので、ちょっと時間をつくれるときにじっくり考えてみます! ワンライナーかっこいいです〜! たぶん前者がわかれば後者もわかるんだと思うので、がんばって読み解きたいです!
toritoritorina

2016/10/24 19:55

valuesについて、補足しました。
hacosato

2016/10/26 03:53

とてもよくわかりました! valueの部分、内包表記を使わない書き方を少しずつ自分なりに書き換えて、変数などをまとめていくと、 values = [statistics.mean(d[key] for d in result) for key in keys] この書き方になる部分まで自力でたどり着くことができました!! たとえば途中経過はこうなりました。↓ values = [] for key in keys: number_list = [d[key] for d in result] mean = statistics.mean(number_list) values.append(mean) 学習しました! ありがとうございます♪
guest

0

愚直に書くとこうなりました。resultの形式を最初から整形して保持することができればtempはいらないのですが、その辺はケースバイケースでしょうか。

python

1import statistics 2from collections import defaultdict 3 4result = [ 5 {'kanji': 106, 'hiragana': 227, 'katakana': 25}, 6 {'kanji': 56, 'hiragana': 188, 'katakana': 36}, 7 {'kanji': 106, 'hiragana': 274, 'katakana': 8} 8] 9 10# 一旦{ 'kanji': [106, 56, 106], ... } の形にして 11temp = defaultdict(list) 12for d in result: 13 for k,v in d.items(): 14 temp[k].append(v) 15 16# からの統計処理 17means = {k: statistics.mean(v) for k,v in temp.items() if len(v) > 0} 18print(means)

投稿2016/10/23 10:37

sharow

総合スコア1149

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

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

hacosato

2016/10/23 11:57

ありがとうございます! いくつか質問があります。 ``` 9 10 # 一旦{ 'kanji': [106, 56, 106], ... } の形にして ---> 11 temp = defaultdict(list) 12 for d in result: 13 for k,v in d.items(): TypeError: first argument must be callable or None ``` いただいた内容をそのまま実行しようとするとこういうエラーが出ます。 何かほかに記載すべきことが抜けていたりしますか? また、 「resultの形式を最初から整形して保持することができればtempはいらない」 とはどういうことでしょうか?
sharow

2016/10/23 12:20

> エラーについて わかりません。私の環境(3.5.2)でも、ideoneのPython3環境でも動いています。可能性としてはそのまま実行せず、なんらかのコードが混ざっていて、組み込み関数listが上書きされている…とか。 > 「resultの形式を最初から整形して保持することができればtempはいらない」 最初から result = { 'kanji': [106, 56, 106], 'hiragana': [227, 188, 274], 'katakana': [25, 36, 8] } means = {k: statistics.mean(v) for k,v in result.items() if len(v) > 0} のように、統計処理の行いやすい形になっていれば変換してtempに格納する必要はない、という意味です。なぜ統計処理にあまり向かない形になっているのかは私の知るところではありませんし、そのような形式になっている理由があるのかもしれませんから、私にははっきりと「こうすべき」とは言えません。そういう意味でケースバイケースという言葉を使いました。
hacosato

2016/10/23 12:43

できました! 失礼しました。 わたしはJupyterを使っていました(それ以外やったことなかった)。 隣のマスで、listという変数を使っていたのが原因のようです。 もうlistという名前の変数は使わないようにします! また、ideoneの存在をはじめて知りました! 手軽に試してみたいときに便利!! resultの形式のことも理解しました! 集計する部分のコードはわたしが書いたので、整形した状態で生成することもやればできそうですが…。 今回は教えていただいたように、集計のときに整形するようにしてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問