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

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

ただいまの
回答率

87.49%

リストの中身の平均値を出したい

解決済

回答 3

投稿 編集

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

score 11

x = []
for i in range(50):
    x.append({'a':i, 'b':i+1, 'c':i+2})


上記のコードのa,b,cそれぞれの平均値を求めたいです。
侍エンジニアさんのサイトを参考に、平均値 = sum(x[a]) / len(x) とやってみたのですが、エラーが出てしまいます。
また、今までリストは x = [1,2,3]のようなものしか扱ったことがありません。
今回のように複数の変数の値をそれぞれ入れて置けるリストには別の呼び方があったりするのでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • firstbn

    2019/11/13 17:55 編集

    申し訳ありません…。修正しました。

    キャンセル

  • LouiS0616

    2019/11/13 18:02

    > 辞書型という言葉はよく目にします。今回のがそれということでしょうか。

    はい。xには辞書型のオブジェクトが追加されていっています。
    『複数の変数の値をそれぞれ入れて置けるリスト』という表現だったので、特殊な構文か何かと勘違いしているのかなぁ、と。

    キャンセル

  • firstbn

    2019/11/13 18:12 編集

    その通りです。ずっとそういう形のリストだと勘違いをしていました。
    教えてくださってありがとうございます!

    キャンセル

回答 3

checkベストアンサー

+2

pythonの内包表記という書き方をしましたが、より分かりやすいコードに書き換えました。
(他の方のご回答もありますがご参考まで。。。)

x = []
for i in range(50):
    x.append({'a':i, 'b':i+1, 'c':i+2})

# 'a'の値の合計を格納する変数
a_sum = 0
# ここでは、xから各辞書データをkとして取り出しています。k={'a':i, 'b':i+1, 'c':i+2}。
# このループはlen(x)=50回繰り返します。
# 各kからk['a']として、'a'の値:iを取出し、a_sumに合計していきます。
for k in x:          
    a_sum += k['a']

# 最後に合計をデータ数で割って平均を出します。
ave = a_sum / len(x)

ご質問への回答は以下の通りです。

1.k['a']とは? 
辞書データkから、キー'a'に対応する値を取り出します。

2.for k in xでは何をxからkに取り出しているのか
xから各辞書データをkとして取り出しています。k={'a':i, 'b':i+1, 'c':i+2}。
一回目のループだと、k={'a':0, 'b':1, 'c':2}。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/13 18:26

    こういうときは元の回答に追記した方が良かったかもです。

    キャンセル

  • 2019/11/13 18:45

    詳しくありがとうございます。理解できました!本当にありがとうございます!

    キャンセル

+1

前提

背景の理解が必要だと思うので、先に前提を書きます。

質問文のコード、

x = []
for i in range(50):
    x.append({'a':i, 'b':i+1, 'c':i+2})

において、xに代入されているlistオブジェクトにappendされている{'a':i, 'b':i+1, 'c':i+2}の部分はdictオブジェクトのリテラルです。

要するにxは辞書を要素に持つlistです。

説明としては上記の通りになりますが、一応結果を見ておきましょう。

lst = []
for i in range(5):
    lst.append({'a':i, 'b':i+1, 'c':i+2})

print(lst)
""" =>
[{'a': 0, 'b': 1, 'c': 2},
 {'a': 1, 'b': 2, 'c': 3},
 {'a': 2, 'b': 3, 'c': 4},
 {'a': 3, 'b': 4, 'c': 5},
 {'a': 4, 'b': 5, 'c': 6}]
"""

変数名は私の好みで変えています。また、例示するだけなのに50回もやる必要はないのに5回にしています。追加したprint関数の出力は見やすいように整形しています。

a, b, cそれぞれの平均値を求めるコード

わかりやすく書くと、こうなります。

# データ作成
lst = []
for i in range(5):
    lst.append({'a':i, 'b':i+1, 'c':i+2})

# aの平均値を求める
tmp = []
for d in lst:
    tmp.append(d["a"])
mean_of_a = sum(tmp) / len(tmp)

# bの平均値を求める
tmp = []
for d in lst:
    tmp.append(d["b"])
mean_of_b = sum(tmp) / len(tmp)

# cの平均値を求める
tmp = []
for d in lst:
    tmp.append(d["c"])
mean_of_c = sum(tmp) / len(tmp)

それぞれの平均値を求めるforループはリスト内包表記を使って以下のようにも書けます。

# データ作成
lst = []
for i in range(5):
    lst.append({'a':i, 'b':i+1, 'c':i+2})

# aの平均値を求める
mean_of_a = sum([d["a"] for d in lst]) / len(lst)

# bの平均値を求める
mean_of_b = sum([d["b"] for d in lst]) / len(lst)

# cの平均値を求める
mean_of_c = sum([d["c"] for d in lst]) / len(lst)

こういう場合は、sumの引数はリスト内包表記にするよりジェネレータ式を使ったほうがスマートです。

# データ作成
lst = []
for i in range(5):
    lst.append({'a':i, 'b':i+1, 'c':i+2})

# aの平均値を求める
mean_of_a = sum(d["a"] for d in lst) / len(lst)

# bの平均値を求める
mean_of_b = sum(d["b"] for d in lst) / len(lst)

# cの平均値を求める
mean_of_c = sum(d["c"] for d in lst) / len(lst)

ほとんど同じものが3つあるのは冗長なので、これもループ化します。

# データ作成
lst = []
for i in range(5):
    lst.append({'a':i, 'b':i+1, 'c':i+2})

# a,b,cの平均値を求める。結果はdictオブジェクトに格納する
result = dict()
for k in "abc":
    result[k] = sum(d[k] for d in lst) / len(lst)

print(result) # => {'a': 2.0, 'b': 3.0, 'c': 4.0}

この場合は辞書内包表記を使っても良いでしょう。

# データ作成
lst = []
for i in range(5):
    lst.append({'a':i, 'b':i+1, 'c':i+2})

# a,b,cの平均値を求める。結果はdictオブジェクトに格納する
result = {k:sum(d[k] for d in lst) / len(lst) for k in "abc"}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/13 18:27

    詳しい解説ありがとうございます。平均値を求めるコードのわかりやすく書いてくださったコードでお聞きしたいことがあるのですが、
    for d in lst:
    tmp.append(d["a"])
    mean_of_a = sum(tmp) / len(tmp)

    上記の for d in lst: でlstからdに何を取り出しているのかがわからないのです。
    d["a"]とできるのはなぜなのでしょうか?

    キャンセル

  • 2019/11/13 18:40 編集

    すみません。調べたらキー(この場合だとa,b,cでしょうか)が取得できるのですね。
    つまりループ一回目だとa["a"]…?
    printしてみるときちんと0~5まで出てきます。キーだと3回までしかループされないような気もするのですが…?

    キャンセル

  • 2019/11/13 18:49

    上記の質問解決いたしました。
    簡単なコードから難しいコードまで段階を踏んで解説してくださりありがとうございます!

    キャンセル

  • 2019/11/13 20:39

    一応書いておきますが、取り出しているのは個々のdictオブジェクトです。
    一回目で
    {'a': 0, 'b': 1, 'c': 2}
    二回目で
    {'a': 1, 'b': 2, 'c': 3}
    三回目で
    {'a': 2, 'b': 3, 'c': 4},
    が取り出されます。

    キャンセル

0

こんなの如何でしょうか。

x = []
for i in range(50):
    x.append({'a':i, 'b':i+1, 'c':i+2})

a_sum = sum(k['a'] for k in x)
ave = a_sum / len(x)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/13 17:49

    回答ありがとうございます。理解できていないので解説を願ってもいいでしょうか。
    a_sum = sum(k['a'] for k in x) 
    1.k['a']とは? 2.for k in xでは何をxからkに取り出しているのか
    この2点が分かりません。

    キャンセル

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

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

関連した質問

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