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

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

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

Kaggleは、機械学習モデルを構築するコンペティションのプラットフォームおよびその運営企業を指します。企業や政府といった組織とデータサイエンティスト・機械学習エンジニアを繋げるプラットフォームであり、単純なマッチングではなくコンペティションが特徴です。

Python

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

Q&A

解決済

4回答

819閲覧

return{dict}[series]という表記の意味

esklia

総合スコア81

Kaggle

Kaggleは、機械学習モデルを構築するコンペティションのプラットフォームおよびその運営企業を指します。企業や政府といった組織とデータサイエンティスト・機械学習エンジニアを繋げるプラットフォームであり、単純なマッチングではなくコンペティションが特徴です。

Python

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

0グッド

0クリップ

投稿2021/08/05 06:47

表題の通りなのですが、

イメージ説明

return{ 'Jan' : 1,'Feb' : 2,'Mar' : 3,'Apr' : 4,'May' : 5,'Jun' : 6,'Jul' : 7, 'Aug' : 8,'Sept' : 9, 'Oct' : 10,'Nov' : 11,'Dec' : 12 }[date]

の箇所で、dictの後に[date]を表記する意味が分かりません。今回はさすがに見たことがなさ過ぎてprintデバッグしても皆目わからないのですが、この実装の流れを教えていただけないでしょうか。

def monthToNum(date): return{ 'Jan' : 1,'Feb' : 2,'Mar' : 3,'Apr' : 4,'May' : 5,'Jun' : 6,'Jul' : 7, 'Aug' : 8,'Sept' : 9, 'Oct' : 10,'Nov' : 11,'Dec' : 12 }[date] store['PromoInterval0'] = store['PromoInterval0'].map(lambda x: monthToNum(x) if str(x) != 'nan' else np.nan) store['PromoInterval1'] = store['PromoInterval1'].map(lambda x: monthToNum(x) if str(x) != 'nan' else np.nan) store['PromoInterval2'] = store['PromoInterval2'].map(lambda x: monthToNum(x) if str(x) != 'nan' else np.nan) store['PromoInterval3'] = store['PromoInterval3'].map(lambda x: monthToNum(x) if str(x) != 'nan' else np.nan) store

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

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

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

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

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

guest

回答4

0

辞書を変数に格納してやると理解できるかと思います。
以下のような流れになっています。

Python

1# date : 'Jan'などの月を表す文字列 2def monthToNum(date): 3 month = {'Jan':1, 'Feb':2,} # 月を表す文字列からそれに対応する月の数値を返す辞書 4 num = month[date] # 1など 5 return num

投稿2021/08/05 07:05

can110

総合スコア38262

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

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

esklia

2021/08/06 06:32

ご回答ありがとうございます。お世話になっております。 リテラルに対して関数などの操作ができることを知らなかったことが原因だったのと、map関数にaxisがあると誤解していたことも理解の妨げになっていたようです。seriesの各要素が辞書のキーとなり入ると考えると明快ですね。
guest

0

ベストアンサー

理解しにくいポイントが2つあると思います。

その1: リテラルから直接メソッドを呼ぶ

他の方も言及しているように、変数に入れて呼べば慣れているので違和感はないのですが、リテラルから直接呼ぶと違和感があります。
ですが、どちらも全く同じで、

  • リテラルはインタープリタでオブジェクトになる
  • 変数はオブジェクトを参照している。=>変数への操作はオブジェクトへの操作

ということです。

python

1# 文字列を大文字化 2s = "abc" 3s.upper() 4 5#リテラルで 6"abc".upper() 7 8 9# 配列の中にある要素の数 10l = [3, 1, 4, 1, 5] 11l.count(1) # => 2 12 13# リテラルで 14[3, 1, 4, 1, 5].count(1) 15 16 17# 整数でもできます。ビット長 18n = 42 19n.bit_length() 20 21# リテラルで 22(42).bit_length() # 整数は()が必要

その2: []を使ったインデックス/キーでのアクセス

リストや辞書は、[]を使って要素にアクセスすることができます。

python

1l = [3, 1, 4, 1, 5] 2l[2] # 4

実はこれも、変数に[]を付けているのではなく、オブジェクトに対する操作なので、先程のリテラルの話と同じように扱うことができるので、以下のものと同じになります。 見なれない感じがすると思いますが、実際に同じです。

python

1[3, 1, 4, 1, 5][2]

質問の表現は、これの辞書版だということです。


ちなみに、関数も同じ仕組みで扱えます。
関数のリテラルはラムダ式です。(pythonのラムダ式は機能が制限されていますが)

python

1f = lambda x: x * 2 2f(5) # 10 3 4(lambda x: x * 2)(5) 5

投稿2021/08/05 14:03

TakaiY

総合スコア12747

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

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

esklia

2021/08/06 06:34

ご回答ありがとうございます。お世話になっております。 学習分野や理解度に偏りがあるので気づかなかったのですが、「文字列リテラル」などと呼ぶようにリテラルを「参照」するものがオブジェクトであり変数なんですね。何かのオブジェクトが<memory as X08a...>などをさしていることも納得いきました。 リテラルに対して関数などの操作ができることを知らなかったことが原因だったのと、map関数にaxisがあると誤解していたことも理解の妨げになっていたようです。seriesの各要素が辞書のキーとなり入ると考えると明快ですね。
guest

0

tuple、list、str、dictのようなオブジェクトでは、[index]を指定して要素を取り出すことができます。

python

1>>> print(['A', 'B', 'C'][2]) 2C 3>>> print('ABCDEFG'[4]) 4E 5>>> print({'A':100, 'B':42, 'C': 128}['B']) 642

従って、

python

1def monthToNum(date): 2 return{ 3 'Jan' : 1,'Feb' : 2,'Mar' : 3,'Apr' : 4,'May' : 5,'Jun' : 6,'Jul' : 7, 4 'Aug' : 8,'Sept' : 9, 'Oct' : 10,'Nov' : 11,'Dec' : 12 5 }[date]

では引き数に与えられたdateをキーとする辞書のvalueを返します。

python

1store['PromoInterval0'] = store['PromoInterval0'].map(lambda x: monthToNum(x) if str(x) != 'nan' else np.nan) 2

では、
mapメソッドがstore['PromoInterval0']の各要素がxとして渡すので、Seriesが渡されるわけではありません。

詳しくは、pandasで要素、行、列に関数を適用するmap, applymap, applyをお読みください。

投稿2021/08/05 09:08

ppaul

総合スコア24666

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

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

esklia

2021/08/06 06:34

ご回答ありがとうございます。お世話になっております。 リテラルに対して関数などの操作ができることを知らなかったことが原因だったのと、map関数にaxisがあると誤解していたことも理解の妨げになっていたようです。seriesの各要素が辞書のキーとなり入ると考えると明快ですね。また、辞書型のキーを参照して値を返すということも、前述の原因で例外があるのではと考えてしまい理解の妨げになっていました。ご教授いただき誠にありがとうございます。
guest

0

{~~:~~, ~~:~~, ~~:~~}は辞書のリテラルです。

辞書[キー]で、辞書の中で指定したキーを持つ要素の値を意味します。

この場合、例えばdate"Mar"だと3ですね。

投稿2021/08/05 07:09

otn

総合スコア84505

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

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

esklia

2021/08/06 06:33

ご回答ありがとうございます。お世話になっております。 リテラルに対して関数などの操作ができることを知らなかったことが原因だったのと、map関数にaxisがあると誤解していたことも理解の妨げになっていたようです。seriesの各要素が辞書のキーとなり入ると考えると明快ですね。
otn

2021/08/06 12:02

> リテラルに対して関数などの操作ができることを知らなかった 変数・関数返り値・リテラル・その他一般の式、何でもOKです。 (["a","b"]+["x","y"])[2] で、"x"とか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問