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

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

新規登録して質問してみよう
ただいま回答率
85.46%
リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

1211閲覧

Python 「if not」文 平均を求める

lovely

総合スコア28

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/08/26 02:11

編集2021/08/26 02:16

質問です。
本に書いてあるコードの意味が分かりません。もしよろしければ、このような場合の良い検索の仕方なども教えていただけると幸いです。

~質問内容~
1.#2の行の構造が理解できません。
if notでifの反対の条件分岐ができることはわかりますが、()の先に:があること、その先のmd[key]=[]というのも微妙です。

2.#1の{:02d}/{:02d}というのは二桁で表したい、ということですか?

3.#3の部分で=が二回出てきていますが、これは二回に分けてやる=の動作を一行にまとめている、ということですか?

Python

1import pandas as pd 2 3df=pd.read_csv("kion-average", encoding="utf-8") 4 5md={} 6for i,row in df.iterrows(): 7 m,d,v=int(row["月"]), int(row["日"]), float(row["気温"]) 8 key="{:02d}/{:02d}".format(m,d) #1 9 if not (key in md): md[key]=[] #2 10 md[key]+=[v] 11 12avs={} 13for key in sorted(md): 14 v=avs[key]=sum(md[key])/len(md[key]) #3 15 print("{0}:{1}".format(key,v)) 16

~コードについて~
これは、excelデータ(下記)を1.日づけごとにリストにまとめ、2.その日づけごとに平均を求める。というコードです。

~Excelデータ~
年,月,日,気温,品質,均質
2011,1,1,6.6,8,1
2011,1,2,7.0,8,1
2011,1,3,5.9,8,1
2011,1,4,6.3,8,1
・・・

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

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

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

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

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

guest

回答2

0

ベストアンサー

1.#2の行の構造が理解できません。

Python

1if not (key in md): md[key]=[] #2

は、

Python

1if not (key in md): 2 md[key]=[] #2

と同じです。if 式:の式の値が真ならmd[key]=[]を実行します。

2.#1の{:02d}/{:02d}というのは二桁で表したい、ということですか?

はい。そうです。9以下の場合は上に0を付けて2桁にします。

3.#3の部分で=が二回出てきていますが、これは二回に分けてやる=の動作を一行にまとめている、ということですか?

はい。代入先 =は複数書けることになっています。

このような場合の良い検索の仕方なども教えていただけると幸いです。

1.3.のような基本文法を知らない場合は、どちらかというと検索するのでなく、入門書やチュートリアルをちゃんと読むというのが良い方法です。

2.のformatメソッドの仕様がわからない場合は、公式サイトのリファレンスを見ます。

投稿2021/08/26 02:30

otn

総合スコア84806

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

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

lovely

2021/08/26 03:05

otnさん、ご回答ありがとうございます。 もう一つ質問させていただきたいのですが、md[key]=[]とmd[key]+=[v]はどういう意味ですか?md[key]が空白の場合、vを入れるということですか??
otn

2021/08/26 03:45

> md[key]が空白の場合、vを入れるということですか?? 違います。 md[key]=[] は、md[key]に空リストを入れるという意味です。 md[key]+=[v] は、md[key]にリストが入っている前提で、そのリストに v を要素として追加します。 if not (key in md): md[key]=[] は全体としては、mdという辞書にkeyというキーが無い場合、md[key]に空リストを入れる、つまり初期値と言うことですね。 これをしないと、 md[key] += [v] のときに、md[key] が存在しないキーを指定しているというエラーになります。 別のやり方としては、最初の md = {} の代わりに、 from collections import defaultdict md = defaultdict(list) とすれば、mdに存在しないキーを指定した場合、キーエラーにならずに、空リストが返りますので、このifの処理は不要になります。
lovely

2021/08/26 04:27

otnさん、ご回答ありがとうございます。 つまり、key="{:02d}/{:02d}".format(m,d)だけだと2月31日などのデータ上存在しない数字が入ってしまうので、md[key]=[]を指定してバグが起きないようにしている、ということでしょうか?
otn

2021/08/26 05:38

全然的外れです。 どこからそんな発想が?? 2021/08/26 12:45 のコメントをちゃんと読みましょう。
lovely

2021/08/26 07:26

keyから気温を指定したいのに#1,2の時点でkeyに何も入っていないということですか?
otn

2021/08/26 07:40

そんなわけ無いでしょ。 どこからそんな発想が??
lovely

2021/08/27 04:47

そうなんですか? import pandas as pd df=pd.read_csv("kion-average", encoding="utf-8") md={} for i,row in df.iterrows(): m,d,v=int(row["月"]), int(row["日"]), float(row["気温"]) key="{:02d}/{:02d}".format(m,d) print(md.keys()) このコードを実行したら、dict_keys([])が出てきました。これはまだ何も入っていないという意味ではないんですか?
lovely

2021/08/27 04:50

すいません、読解力がないもので。。私の思考が的外れであれば、もう一度ご教授願います。。。
otn

2021/08/27 05:42 編集

md は、md ={} のまま更新されてないので空で、そのキー一覧も空ですね。 まだ何も入っていないと言うことです。 もしかして、key(=日付の文字列) と md (=辞書)の区別が付いていないのでしょうか?
lovely

2021/08/27 05:50

md[key]=[]の時点でmdにkeyを入れてるんですよね? このexcelデータには、日付なしに気温しか書いてないようなデータはないのでどうして空白データを入れないと動かないのかわかりません。
otn

2021/08/27 08:26

> md[key]=[]の時点でmdにkeyを入れてるんですよね? いいえ。md[key]に[]を入れています。 > このexcelデータには、日付なしに気温しか書いてないようなデータはないのでどうして空白データを入れないと動かないのかわかりません。 中身が空の箱には中身を追加できるけど、箱が存在しないときには中身の追加のしようが無いからです。
lovely

2021/08/31 11:11

なるほど、理解できました!ありがとうございます!
guest

0

  • 1.#2の行の構造が理解できません。

()の先に:があること、その先のmd[key]=[]というのも微妙です。

公式ドキュメント 8. 複合文 (compound statement)に以下のように書かれています。

複合文は、一つ以上の '節 (clause)' からなります。節は、ヘッダと 'スイート (suite)' からなります。一つの複合文を成す各節のヘッダは、全て同じインデントレベルに置かれます。各節のヘッダは一意に識別するキーワードで始まり、コロンで終わります。スイートは、節によって制御される文の集まりです。スイートは、ヘッダがある行のコロンの後にセミコロンで区切って置かれた一つ以上の単純文、または、ヘッダに続く行で一つ多くインデントされた文の集まりです。

以下の二つのコードは同じ意味です。
「スイートは、ヘッダがある行のコロンの後にセミコロンで区切って置かれた一つ以上の単純文」で書くと

python

1if x == 0: y = 5; z = 8

「ヘッダに続く行で一つ多くインデントされた文の集まり」で書くと

python

1if x == 0: 2 y = 5 3 z = 8
  • 2.#1の{:02d}/{:02d}というのは二桁で表したい、ということですか?

公式ドキュメント 2.4.3. フォーマット済み文字列リテラルのフォーマットの詳細は、公式ドキュメント 書式指定文字列の文法の書式指定ミニ言語仕様に書かれています。

format_spec ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type]
の[0][width]で、0を指定してゼロ埋めをしてwidthに2を指定しているという意味です。
BNFが分からないなら、Python, formatで書式変換(0埋め、指数表記、16進数など)の方がわかりやすいでしょう。

  • 3.#3の部分で=が二回出てきていますが、これは二回に分けてやる=の動作を一行にまとめている、ということですか?

公式ドキュメント 7.2. 代入文 (assignment statement)
に以下のように書いてあります。

代入文は式のリスト (これは単一の式でも、カンマで区切られた式リストでもよく、後者はタプルになることを思い出してください) を評価し、得られた単一の結果オブジェクトをターゲット (target) のリストに対して左から右へと代入してゆきます。

少し分かりにくいですが、最後の等号の右の式を計算して、それを左から順に代入していくということです。

左から右に代入していくため以下のようなことが起きるので注意してください。

python

1>>> a,b = a = 3, 4 + 1 2>>> print(a) 3(3, 5) 4>>> print(b) 55

投稿2021/08/26 02:53

ppaul

総合スコア24666

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

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

lovely

2021/08/26 03:47

ppaulさん、ご回答ありがとうございます。3つ目だけよくわからなかったのですが、a,b=a=3,4+1はa,b=3,5と同じ。ということでしょうか??
ppaul

2021/08/26 04:19

違います。 a,b=a=3,4+1 は a,b=a=3,5 と同じです。 まず、aには3が入り、bには5が入ります。 その次にaには(3,5)が入ります。 その結果、aには(3,5)が入っていて、bには5が入っていることになります。 これが「左から右へと代入してゆきます」の意味です。
lovely

2021/08/26 04:28

ppaulさん、ご返信ありがとうございます。 つまり、a=b=3,5の場合はa,b=3,5と同じ、ということですか?
ppaul

2021/08/26 05:40

全然違います。 実行してみましたか?
lovely

2021/08/26 07:37

はい。 a = b = 3,5 print(a) a,b=3,5 print(a,b) 上記のコードを実行し、下記のような結果が出ました。 (3, 5) 3 5 このように実行すると見た目は違いますが、私が質問させていただいたコードの中で使われているv=avs[key]=sum(md[key])/len(md[key])を実行したときに()は出てこなかったので、実質同じなのかと思っていましたが、そういうわけではないんですね。 では、どうして今回のコードでは()が消えているのですか??
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問