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

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

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

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

Q&A

解決済

3回答

5424閲覧

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

firstbn

総合スコア11

Python

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

0グッド

0クリップ

投稿2019/11/13 08:32

編集2019/11/13 08:55

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ページで確認できます。

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

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

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

LouiS0616

2019/11/13 08:39

Pythonには辞書と呼ばれるオブジェクトがありますが、ご存知ですか。
firstbn

2019/11/13 08:42 編集

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

2019/11/13 08:51

質問文のコードは動作しません。動作するコードを記載してください。
firstbn

2019/11/13 08:55 編集

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

2019/11/13 09:02

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

2019/11/13 09:12 編集

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

回答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

takashim

総合スコア124

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

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

LouiS0616

2019/11/13 09:26

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

2019/11/13 09:45

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

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
hayataka2049

総合スコア30933

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

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

firstbn

2019/11/13 09:27

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

2019/11/13 09:40 編集

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

2019/11/13 09:49

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

2019/11/13 11:39

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

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

takashim

総合スコア124

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

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

firstbn

2019/11/13 08:49

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問