2017-04-09 85 views
4

2类型的字典值我有2点字典:比较在Python

budgets = {'Engineering': 4500.0, 
'Marketing': 5000.0, 
'Operations': 3000.0, 
'Sales': 2000.0} 

spending = {'Engineering': 5020.0, 
'Marketing': 1550.0, 
'Operations': 3670.0, 
'Sales': 3320.0} 

我通过他们试图循环每找出spending该值比在budgets值越大。我现在已经写了:

for value in spending.values(): 
    if value in spending.values() > budgets.values(): 
     print 'Over Budget' 
    else: 
     print 'Under Budget' 

然而,当我运行此,它们都打印Over Budget这显然并非如此。有人可以解释我的错误来解决这个问题吗?

谢谢:)

回答

6

的部分value in spending.values() > budgets.values()实际评估布尔查询value in spending.values() --a成员资格检查 - 那么,要budget.values()结果比较:从budget值。在Python中,所有内容都可以进行比较,因此您可以将布尔值与列表进行比较 - 每次都是同样的事情,在您的情况下计算结果为True。你想要的更像是这样的:

for key in spending: 
    if spending[key] > budgets[key]: 
     print('Over Budget') 
    else: 
     print('Under Budget') 

编辑:这只适用于Python 2。在Python 3中,你得到TypeError: unorderable types,这可以让你避免这样的错误。

+1

我upvoted,但你应该提到这是特定于Python 2.在Python 3中,大多数类型间比较给出了一个错误。 –

+1

好点。自从他使用'print'语句之后,我假定Python 2,不含括号。 –

+2

是的。确实它被标记为Python 2.7 –

0

if value in spending.values() > budgets.values():应该是value in spending.values():

for value in spending.values(): 
    v={k:v for (k,v) in budgets.items() if v > value} 
    if v: 
     print "Under" 
    else: 
     print value, "is spending greater than the values in budget" 
+2

这种情况并没有做它应该做的事情。你的情况几乎是在做'5000> [5000.0,2000.0,4500.0,3000.0]'。这是不正确的。 – idjaw

+0

@idjaw,感谢您的注意..更新。 –

2

如何使用dict.items()

budgets = {'Engineering': 4500.0, 
'Marketing': 5000.0, 
'Operations': 3000.0, 
'Sales': 2000.0} 

spending = {'Engineering': 5020.0, 
'Marketing': 1550.0, 
'Operations': 3670.0, 
'Sales': 3320.0} 

for category, spent in spending.items(): 
    print(category) 
    if spent > budgets[category]: 
     print('Over Budget') 
    else: 
     print('Under Budget') 
1

@aryamccarthy有一个伟大的答案,但对于Python的缘故,我会后的另一种方法,你可以采取,仅使用一条线:

{(sk, 'Over Budget') if sv > budgets[sk] 
     else (sk, 'Under Budget') for sk, sv in spending.items()} 

这个方法返回以下,这不一定是显示信息的最漂亮的方式,但它不是很远,从这里到使用print漂亮输出:

{('Marketing', 'Under Budget'), ('Sales', 'Over Budget'), ('Engineering', 'Over Budget'), ('Operations', 'Over Budget')} 

注意,这将提高一个KeyError的情况下spending中的任何密钥也不属于budgets

+2

这不是*真的*一行:P – idjaw

+2

这只是语义:)如果我想要,我可以使它成为10行...... – blacksite