python
1x = [] 2for i in range(50): 3 x.append({'a':i, 'b':i+1, 'c':i+2})
上記のコードのa,b,cそれぞれの平均値を求めたいです。
侍エンジニアさんのサイトを参考に、平均値 = sum(x[a]) / len(x) とやってみたのですが、エラーが出てしまいます。
また、今までリストは x = [1,2,3]のようなものしか扱ったことがありません。
今回のように複数の変数の値をそれぞれ入れて置けるリストには別の呼び方があったりするのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/13 08:42 編集
2019/11/13 08:51
2019/11/13 08:55 編集
2019/11/13 09:02
2019/11/13 09:12 編集
回答3件
0
ベストアンサー
pythonの内包表記という書き方をしましたが、より分かりやすいコードに書き換えました。
(他の方のご回答もありますがご参考まで。。。)
python
1x = [] 2for i in range(50): 3 x.append({'a':i, 'b':i+1, 'c':i+2}) 4 5# 'a'の値の合計を格納する変数 6a_sum = 0 7# ここでは、xから各辞書データをkとして取り出しています。k={'a':i, 'b':i+1, 'c':i+2}。 8# このループはlen(x)=50回繰り返します。 9# 各kからk['a']として、'a'の値:iを取出し、a_sumに合計していきます。 10for k in x: 11 a_sum += k['a'] 12 13# 最後に合計をデータ数で割って平均を出します。 14ave = 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 09:17
総合スコア124
0
前提
背景の理解が必要だと思うので、先に前提を書きます。
質問文のコード、
python
1x = [] 2for i in range(50): 3 x.append({'a':i, 'b':i+1, 'c':i+2})
において、xに代入されているlistオブジェクトにappendされている{'a':i, 'b':i+1, 'c':i+2}
の部分はdictオブジェクトのリテラルです。
要するにxは辞書を要素に持つlistです。
説明としては上記の通りになりますが、一応結果を見ておきましょう。
python
1lst = [] 2for i in range(5): 3 lst.append({'a':i, 'b':i+1, 'c':i+2}) 4 5print(lst) 6""" => 7[{'a': 0, 'b': 1, 'c': 2}, 8 {'a': 1, 'b': 2, 'c': 3}, 9 {'a': 2, 'b': 3, 'c': 4}, 10 {'a': 3, 'b': 4, 'c': 5}, 11 {'a': 4, 'b': 5, 'c': 6}] 12"""
変数名は私の好みで変えています。また、例示するだけなのに50回もやる必要はないのに5回にしています。追加したprint関数の出力は見やすいように整形しています。
a, b, cそれぞれの平均値を求めるコード
わかりやすく書くと、こうなります。
python
1# データ作成 2lst = [] 3for i in range(5): 4 lst.append({'a':i, 'b':i+1, 'c':i+2}) 5 6# aの平均値を求める 7tmp = [] 8for d in lst: 9 tmp.append(d["a"]) 10mean_of_a = sum(tmp) / len(tmp) 11 12# bの平均値を求める 13tmp = [] 14for d in lst: 15 tmp.append(d["b"]) 16mean_of_b = sum(tmp) / len(tmp) 17 18# cの平均値を求める 19tmp = [] 20for d in lst: 21 tmp.append(d["c"]) 22mean_of_c = sum(tmp) / len(tmp) 23 24
それぞれの平均値を求めるforループはリスト内包表記を使って以下のようにも書けます。
python
1# データ作成 2lst = [] 3for i in range(5): 4 lst.append({'a':i, 'b':i+1, 'c':i+2}) 5 6# aの平均値を求める 7mean_of_a = sum([d["a"] for d in lst]) / len(lst) 8 9# bの平均値を求める 10mean_of_b = sum([d["b"] for d in lst]) / len(lst) 11 12# cの平均値を求める 13mean_of_c = sum([d["c"] for d in lst]) / len(lst) 14
こういう場合は、sumの引数はリスト内包表記にするよりジェネレータ式を使ったほうがスマートです。
python
1# データ作成 2lst = [] 3for i in range(5): 4 lst.append({'a':i, 'b':i+1, 'c':i+2}) 5 6# aの平均値を求める 7mean_of_a = sum(d["a"] for d in lst) / len(lst) 8 9# bの平均値を求める 10mean_of_b = sum(d["b"] for d in lst) / len(lst) 11 12# cの平均値を求める 13mean_of_c = sum(d["c"] for d in lst) / len(lst) 14
ほとんど同じものが3つあるのは冗長なので、これもループ化します。
python
1# データ作成 2lst = [] 3for i in range(5): 4 lst.append({'a':i, 'b':i+1, 'c':i+2}) 5 6# a,b,cの平均値を求める。結果はdictオブジェクトに格納する 7result = dict() 8for k in "abc": 9 result[k] = sum(d[k] for d in lst) / len(lst) 10 11print(result) # => {'a': 2.0, 'b': 3.0, 'c': 4.0}
この場合は辞書内包表記を使っても良いでしょう。
python
1# データ作成 2lst = [] 3for i in range(5): 4 lst.append({'a':i, 'b':i+1, 'c':i+2}) 5 6# a,b,cの平均値を求める。結果はdictオブジェクトに格納する 7result = {k:sum(d[k] for d in lst) / len(lst) for k in "abc"} 8
投稿2019/11/13 09:12
編集2019/11/13 09:13総合スコア30935
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/13 09:27
2019/11/13 09:40 編集
2019/11/13 09:49
2019/11/13 11:39
0
こんなの如何でしょうか。
python3
1x = [] 2for i in range(50): 3 x.append({'a':i, 'b':i+1, 'c':i+2}) 4 5a_sum = sum(k['a'] for k in x) 6ave = a_sum / len(x)
投稿2019/11/13 08:43
総合スコア124
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。