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