Нахождение максимума из набора дополнительных ключей в словаре в Python - PullRequest
0 голосов
/ 06 января 2019

У меня есть список, который выглядит следующим образом (это данные Enron, и, следовательно, общедоступные, поэтому я уверен, что здесь я не нарушаю никаких правил):

{
   'METTS MARK':{
      'salary':365788,
      'to_messages':807,
      'deferral_payments':'NaN',
      'total_payments':1061827,
      'loan_advances':'NaN',
      'bonus':600000,
      'email_address':'mark.metts@enron.com',
      'restricted_stock_deferred':'NaN',
      'deferred_income':'NaN',
      'total_stock_value':585062,
      'expenses':94299,
      'from_poi_to_this_person':38,
      'exercised_stock_options':'NaN',
      'from_messages':29,
      'other':1740,
      'from_this_person_to_poi':1,
      'poi':False,
      'long_term_incentive':'NaN',
      'shared_receipt_with_poi':702,
      'restricted_stock':585062,
      'director_fees':'NaN'
   },
   'BAXTER JOHN C':{
      'salary':267102,
      'to_messages':'NaN',
      'deferral_payments':1295738,
      'total_payments':5634343,
      'loan_advances':'NaN',
      'bonus':1200000,
      'email_address':'NaN',
      'restricted_stock_deferred':'NaN',
      'deferred_income':-1386055,
      'total_stock_value':10623258,
      'expenses':11200,
      'from_poi_to_this_person':'NaN',
      'exercised_stock_options':6680544,
      'from_messages':'NaN',
      'other':2660303,
      'from_this_person_to_poi':'NaN',
      'poi':False,
      'long_term_incentive':1586055,
      'shared_receipt_with_poi':'NaN',
      'restricted_stock':3942714,
      'director_fees':'NaN'
   },
   'ELLIOTT STEVEN':{
      'salary':170941,
      'to_messages':'NaN',
      'deferral_payments':'NaN',
      'total_payments':211725,
      'loan_advances':'NaN',
      'bonus':350000,
      'email_address':'steven.elliott@enron.com',
      'restricted_stock_deferred':'NaN',
      'deferred_income':-400729,
      'total_stock_value':6678735,
      'expenses':78552,
      'from_poi_to_this_person':'NaN',
      'exercised_stock_options':4890344,
      'from_messages':'NaN',
      'other':12961,
      'from_this_person_to_poi':'NaN',
      'poi':False,
      'long_term_incentive':'NaN',
      'shared_receipt_with_poi':'NaN',
      'restricted_stock':1788391,
      'director_fees':'NaN'
   }
}

Я пытаюсь составить список всех exercised_stock_options значений, а затем хочу найти не NaN значения и выполнить макс / мин.

Я сделал это, но получил неправильный ответ, и я не уверен, почему:

eso = []
for k,v in data_dict.items():
    # name.append[str(k)]
    eso.append(v['exercised_stock_options'])

# Remove NaN values in list
eso = [x for x in eso if str(x) != 'NaN']

print(eso)

sorted(eso)
print(eso[0])
print(eso[-1])

Но потом я увидел этот ответ, и он правильный, но я не вижу, что я делаю не так?

stock = []
for i in data_dict:
    if (data_dict[i]["exercised_stock_options"]=='NaN'):
        pass
    else:
        stock.append(float(data_dict[i]["exercised_stock_options"]))

ma = max(stock)
mi = min(stock)

print ("Exercised stock options maximum: ", ma, " minimum: ", mi)

1 Ответ

0 голосов
/ 06 января 2019

В первом случае значения сортируются как строки, однако вы хотите отсортировать их как числа. Вот почему неявное приведение типов (с функцией float) используется во втором случае.

Возможно, вы захотите изменить строку eso.append(v['exercised_stock_options']) на eso.append(float(v['exercised_stock_options'])). Но сначала вы должны избавиться от значений «NaN».

...