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

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

ただいまの
回答率

87.80%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,325

score 47

前提・実現したいこと

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

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

該当のソースコード

import statistics

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


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

89.33333333333333
229.66666666666666
23.0


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

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

本当は

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


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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

import statistics

result = [
    {'kanji': 106, 'hiragana': 227, 'katakana': 25},
    {'kanji': 56, 'hiragana': 188, 'katakana': 36},
    {'kanji': 106, 'hiragana': 274, 'katakana': 8},
]

# ['kanji', 'hiragana', 'katakana']
keys = [key for key in result[0].keys()]

# [89.33333333333333, 229.66666666666666, 23]
values = [statistics.mean(d[key] for d in result) for key in keys]

# {'hiragana': 229.66666666666666, 'kanji': 89.33333333333333, 'katakana': 23}
means_dict = {key: value for key, value in zip(keys, values)}
print(means_dict)

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

values = []
for key in keys:
    number_list = []
    for d in result:
        number_list.append(d[key])
    mean = statistics.mean(number_list)
    values.append(mean)

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/25 00:59

    ありがとうございます!

    values = [statistics.mean(d[key] for d in result) for key in keys]

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

    キャンセル

  • 2016/10/25 04:55

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

    キャンセル

  • 2016/10/26 12: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)

    学習しました! ありがとうございます♪

    キャンセル

0

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

import statistics
from collections import defaultdict

result = [
    {'kanji': 106, 'hiragana': 227, 'katakana': 25},
    {'kanji': 56,  'hiragana': 188, 'katakana': 36},
    {'kanji': 106, 'hiragana': 274, 'katakana': 8}
]

# 一旦{ 'kanji': [106, 56, 106], ... } の形にして
temp = defaultdict(list)
for d in result:
    for k,v in d.items():
        temp[k].append(v)

# からの統計処理
means = {k: statistics.mean(v) for k,v in temp.items() if len(v) > 0}
print(means)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/23 20: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はいらない」
    とはどういうことでしょうか?

    キャンセル

  • 2016/10/23 21: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に格納する必要はない、という意味です。なぜ統計処理にあまり向かない形になっているのかは私の知るところではありませんし、そのような形式になっている理由があるのかもしれませんから、私にははっきりと「こうすべき」とは言えません。そういう意味でケースバイケースという言葉を使いました。

    キャンセル

  • 2016/10/23 21:43

    できました! 失礼しました。
    わたしはJupyterを使っていました(それ以外やったことなかった)。
    隣のマスで、listという変数を使っていたのが原因のようです。
    もうlistという名前の変数は使わないようにします!
    また、ideoneの存在をはじめて知りました! 手軽に試してみたいときに便利!!

    resultの形式のことも理解しました!
    集計する部分のコードはわたしが書いたので、整形した状態で生成することもやればできそうですが…。
    今回は教えていただいたように、集計のときに整形するようにしてみたいと思います。

    キャンセル

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

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る