2017-02-13 186 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打印迭代过程中最后一个值,即字典中的最后一个键。 – dhke

+0

很高兴看到你真的想做点什么。这是这里初学者非常鼓励的那类问题。 –

回答

7

你最初的错误是将错误的数据存储为max而不是工资值。

可以计算最大更加eficiently和“Python的”关于使用key函数,它是一个元组的工资/奖金字典使用max(所以同样的薪水:比较了奖金):

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

这给我

METTS MARK 
+1

再次,好的工作总结了一些事情,但可能想告诉他,他正在重新分配一本字典,并且仍然试图将其与数字进行比较.... – MooingRawr

+0

你是对的。我对pythonic的东西太多了:)稍作编辑。 –

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中的键称为“我”,而应该在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 [name] ['salary]> high_salary和!= “NaN”:“,但它会引发语法错误,将它嵌套为if语句会给出正确的值,但是错误的人 –

+0

没关系,我通过将print中的”name“更改为”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