Python中比较两个字典的值

4

我有两个字典:

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'

然而,当我运行这个程序时,它们都打印出超预算,显然并不是这样的。请问有人可以解释一下我的错误吗?
谢谢 :)
4个回答

6
该部分 value in spending.values() > budgets.values() 实际上是评估布尔查询 value in spending.values()--成员检查--然后将结果与来自的值budget.values()进行比较。在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
我已经点赞了,但你应该提到这只适用于Python 2。在Python 3中,大多数不同类型的比较会产生错误。 - juanpa.arrivillaga
1
好的观点。我假设他使用的是Python 2,因为他使用了没有括号的“print”语句。 - Arya McCarthy
2
是的,确实标记为Python 2.7。 - juanpa.arrivillaga

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')}

请注意,如果 spending 中的任何键不属于 budgets,则会引发 KeyError

2
这并不是真正的一行代码 :P - idjaw

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接