2017-04-09 91 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