比较Python中两个dicts的值

时间:2017-04-09 00:47:12

标签: python python-2.7 loops dictionary for-loop

我有2个词典:

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,但事实并非如此。有人可以解释我接近这个错误吗?

谢谢:)

4 个答案:

答案 0 :(得分:6)

部分value in spending.values() > budgets.values()实际上评估布尔查询value in spending.values() - 成员资格检查 - 然后将其结果与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 :(得分: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')

答案 2 :(得分:1)

@aryamccarthy有一个很好的答案,但是为了Python,我会发布另一种你可以采用的方法,只使用一行:

import socketio
import eventlet
from flask import Flask, request

sio = socketio.Server()
app = Flask(__name__)


@app.route('/test/<param>')
def get(param):
    def ack(data):
        print (data) #Should be the response
    sio.emit('event', param, callback=ack) # Socket server call my ack function
    #Without a return statement, the endpoint return 500

if __name__ == '__main__':
    app = socketio.Middleware(sio, app)
    eventlet.wsgi.server(eventlet.listen(('', 8000)), app)

这种方法返回以下内容,这不一定是显示信息的最漂亮的方式,但是从这里使用{(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

答案 3 :(得分: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"