2017-02-13 2 views
3

У меня есть словарь, который выглядит примерно так:Как сравнить значения в словаре?

{'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': '[email protected]', 'from_poi_to_this_person': 38}, 
'BAXTER JOHN C': {'salary': 267102, 'to_messages': 'NaN', 'deferral_payments': 1295738, 'total_payments': 5634343, 'exercised_stock_options': 6680544, 'bonus': 1200000, 'restricted_stock': 3942714, 'shared_receipt_with_poi': 'NaN', 'restricted_stock_deferred': 'NaN', 'total_stock_value': 10623258, 'expenses': 11200, 'loan_advances': 'NaN', 'from_messages': 'NaN', 'other': 2660303, 'from_this_person_to_poi': 'NaN', 'poi': False, 'director_fees': 'NaN', 'deferred_income': -1386055, 'long_term_incentive': 1586055, 'email_address': 'NaN', 'from_poi_to_this_person': 'NaN'}, 
'ELLIOTT STEVEN': {'salary': 170941, 'to_messages': 'NaN', 'deferral_payments': 'NaN', 'total_payments': 211725, 'exercised_stock_options': 4890344, 'bonus': 350000, 'restricted_stock': 1788391, 'shared_receipt_with_poi': 'NaN', 'restricted_stock_deferred': 'NaN', 'total_stock_value': 6678735, 'expenses': 78552, 'loan_advances': 'NaN', 'from_messages': 'NaN', 'other': 12961, 'from_this_person_to_poi': 'NaN', 'poi': False, 'director_fees': 'NaN', 'deferred_income': -400729, 'long_term_incentive': 'NaN', 'email_address': '[email protected]', 'from_poi_to_this_person': 'NaN'} 
} 

Это лишь малая часть словаря, хотя. Как я могу использовать цикл for для циклического вычисления значений зарплаты каждого подъяручного словаря и сравнить его со следующей, чтобы узнать, кто имеет самую большую зарплату? Я пытался что-то вроде этого:

big = 0 
for i in data_dict: 
    if data_dict[i]["salary"] > big: 
     big = i 
print i 

Это не дает мне правильного ответа. Кроме того, как я могу использовать цикл for, чтобы проверить, кто имеет самую большую зарплату и самый большой бонус? Любая помощь будет принята с благодарностью. Спасибо.

+0

'большой = i' <= Вы хранения ключа (то есть имя) вместо значения заработной платы. 'print i' выводит последнее значение, которое' i' принимало во время итерации, т. е. последний ключ в словаре. – dhke

+0

Приятно видеть, что вы на самом деле пытались что-то сделать. Это вопрос, который очень приветствуется у начинающих здесь. –

ответ

7

Ваша первоначальная ошибка состояла в том, чтобы хранить неверные данные как max вместо значения зарплаты.

Вы можете вычислить максимум более eficiently и «вещий» с помощью max по словарю, используя key функцию, которая является кортежем зарплата/бонус (так же зарплата: сравнивает на бонус):

print(max(d,key=lambda x : (d[x]["salary"],d[x]["bonus"]))) 

это дает мне

METTS MARK 
+1

Еще раз, хорошая работа 'sum'ming вещи вверх, но, возможно, захочет сказать ему, что он переназначает большой со словарем и все еще пытается сравнить это с цифрами .... – MooingRawr

+0

вы правы. Я слишком разбираюсь в питоническом материале :) слегка отредактирован. –

0

Попробуйте это:

big = 0 

    for i in data_dict: 
     if int(i['salary']) > big: 
      big = i 
    print i 

Запомнить что массив или объекты, как это:

['Person': {a:5,b:6},'Person': {a:3,b:6}] 
+0

'TypeError: строковые индексы должны быть целыми числами, вы в основном делаете ту же ошибку, что и OP ....вы назначаете большое значение словаря и по-прежнему ожидаете его сравнения с int .... – MooingRawr

+0

добавление int в вашу строку решает проблему – Carlo

0

Ваша проблема заключается в том, что после первого цикла, вы сравниваете зарплату текущего человека на имя предыдущего человека. Вы должны быть более ясными в своем соглашении об именах, чтобы избежать таких ошибок. Например, вместо того, чтобы ссылаться на ключи в вашем data_dict как «i», вы должны указать им описательное имя в цикле for for:. Изменение вашего кода немного будет производить правильный результат:

high_salary = 0 
high_salary_holder = '' 
for name in data_dict: 
    if data_dict[name]['salary'] > high_salary: 
     high_salary = data_dict[name]['salary'] 
     high_salary_holder = name 
print name, str(high_salary) 

Это предполагает, что заработная плата всегда будет поплавок или целое число. Вы можете добавить дополнительные заполнители и сравнения, чтобы определить, кто имеет наибольший бонус.

+0

Я считаю, что это больше всего соответствует тому, что я пытаюсь сделать. Это может быть более сложным, чем другие ответы, но я чувствую, что пытаюсь решить его таким образом, чтобы помочь мне получить синтаксис больше (если кто-то считает, что это не стоит (или вредно), хотя, пожалуйста, дайте мне знать. должен был упомянуть, что не все значения являются целыми или плавающими, некоторые из значений равны «NaN». Как бы я справился с этим? Я пробовал «если data_dict [имя] ['зарплата]> high_salary и! = «NaN»: «, но он выдает синтаксическую ошибку. Вложение его в качестве оператора if дает правильное значение, но не тот человек. –

+0

Ничего. Я понял это, изменив вызов« имя »в печати на« high_salary_holder » Спасибо большое за помощь! –

0

Вы можете урезать большой словарь у вас есть в только name: salary пар ключ-значение, если вы просто хотите, чтобы выяснить, кто имеет самую большую зарплату и вы не заботитесь о некоторых других атрибутов (хотя нелегко использовать меньший словарь для маневрирования более крупного словаря).

just_salary = {name: d[name]['salary'] for name in d} 

just_salary 
Out[143]: {'BAXTER JOHN C': 267102, 'ELLIOTT STEVEN': 170941, 'METTS MARK': 365788} 

# Give me the tuple for which salary (the second item) is greatest 
max(just_salary.items(), key = lambda x: x[1]) 
Out[144]: ('METTS MARK', 365788) 
0

Вы можете сделать это следующим образом:

my_dict = { 
'METTS MARK': {'salary': 365788,'age': 32}, 
'ELLIOTT STEVEN': {'salary': 170941,'age': 54}, 
'TRUMP DONALD': {'salary': 10000,'age': 70}} 

sorted_dict = sorted(my_dict.iteritems(), key=lambda x: x[1]['salary']) 

for key,value in sorted_dict: 
    if value['salary']>100000: 
     print value