周回遅れでIT業界デビューしたプロジェクトマネージャーのブログ

就職氷河期にモロにぶち当たり、人生で混迷を極めた末にIT業界に安寧を見出そうとしているアラフォーの活動日記です。

Python dictのkeyとitemを全て取得する(Python2)

f:id:sionff:20180119162019j:plain

勉強中に詰まった話

udacityの「Intro to Machine Learning」で勉強している途中、Lesson 9の22でちょっと詰まりました。エンロン社の不正にかかわった人物が行使したストックオプションの最大値と最低値を検出する問題なんですけれど……

  • データが入っているdata_dictはdict型。
  • NaNが混じっている。

↓こんな感じでネストされています。

{'METTS MARK': {'salary': 365788, 'to_messages': 807, 'deferral_payments': 'NaN', 'total_payments': 1061827, 'exercised_stock_options': 'NaN', 'bonus': 600000, 'restricted_stock': 585062, 'shared_receipt_with_poi': 702, 'restricted_stock_deferred': 'NaN', 'total_stock_value': 585062, 'expenses': 94299, 'loan_advances': 'NaN', 'from_messages': 29, 'other': 1740, 'from_this_person_to_poi': 1, 'poi': False, 'director_fees': 'NaN', 'deferred_income': 'NaN', 'long_term_incentive': 'NaN', 'email_address': 'mark.metts@enron.com', 'from_poi_to_this_person': 38}, 'BAXTER JOHN C':

上手く行かない

最初はNaNを置換して0にしようとしたんだけれど上手くいきません。

for key, values in data_dict:
    for k, v in values:
        if v == 'NaN':
            v.replace('NaN', '0')

-> too many values to unpack

「valuesのところに入る変数が多すぎてunpack出来ないよー」だそうです。for文で回したかったので調べてみたら、iteritems()なるものを発見しました。

上のdata_dictの部分を、data_dict.iteritems()に変更したら動きました。けれどNaNの除去がうまくいかなかったので、NaNでない値を取得してリストに放り込む方法に変更。

結果はこちら

sop = []
for k, v in data_dict.iteritems():
    if v["exercised_stock_options"] != 'NaN':
        sop.append(v["exercised_stock_options"])

print max(sop), min(sop)

あぁ、やっと課題ができたと思ったら……iteritems()ってpython2だけのメソッドのようでした。がーん。

www.ibm.com

valuesにdict型をオブジェクトとして突っ込んでるつもりだったんだけれどそういう事か!

udacityのこのコースがpython2なので、こういうことも起こるという。
2系と3系の違いを知るいい勉強になりました。