2012-10-23 156 views
1

第一個字典是固定的。這個字典將保持原樣,因爲它是具有短名稱的國家列表。Python:比較兩個字典

firstDict={'ERITREA': 'ER', 'LAOS': 'LA', 'PORTUGAL': 'PT', "D'IVOIRE": 'CI', 'MONTENEGRO': 'ME', 'NEW CALEDONIA': 'NC', 'SVALBARD AND JAN MAYEN': 'SJ', 'BAHAMAS': 'BS', 'TOGO': 'TG', 'CROATIA': 'HR', 'LUXEMBOURG': 'LU', 'GHANA': 'GH'} 

但是這個元組的結果有內部it.This多個快譯通是在MySQLdb的返回結果的格式爲:

result =({'count': 1L, 'country': 'Eritrea'}, {'count': 1L, 'country': 'Togo'}, {'count': 1L, 'country': 'Sierra Leone'}, {'count': 3L, 'country': 'Bahamas'}, {'count': 1L, 'country': 'Ghana'}) 

現在我想比較這兩種結果與國名。如果「國家」在結果出現在firstDict然後把value.else把0 期望的結果是:

mainRes={'ER':1,'TG':1,'BS':3,'GH':0,'LU':0} 
+1

您的期望結果不一致。你要求把'0'同時忽略。請檢查。我猜你的結果應該是ER 1 TG 1 BS 3 GH 1 –

+0

@AntonyThomas對不起我的壞。我以錯誤的方式引用了這個問題。編輯它 –

回答

4
In [2]: firstDict={'ERITREA': 'ER', 'LAOS': 'LA', 'PORTUGAL': 'PT', "D'IVOIRE": 'CI', 'MONTENEGRO': 'ME', 'NEW CALEDONIA': 'NC', 'SVALBARD AND JAN MAYEN': 'SJ', 'BAHAMAS': 'BS', 'TOGO': 'TG', 'CROATIA': 'HR', 'LUXEMBOURG': 'LU', 'GHANA': 'GH'} 

In [3]: result =({'count': 1L, 'country': 'Eritrea'}, {'count': 1L, 'country': 'Togo'}, {'count': 1L, 'country': 'Sierra Leone'}, {'count': 3L, 'country': 'Bahamas'}, {'count': 1L, 'country': 'Ghana'}) 

In [4]: resdict = {r['country'].upper():r['count'] for r in result} 

In [5]: mainRes = {abbrev:resdict.get(country,0) for country, abbrev in firstDict.items()} 

In [6]: mainRes 
Out[6]: 
{'BS': 3L, 
'CI': 0, 
'ER': 1L, 
'GH': 1L, 
'HR': 0, 
'LA': 0, 
'LU': 0, 
'ME': 0, 
'NC': 0, 
'PT': 0, 
'SJ': 0, 
'TG': 1L} 

在python2.6的以上的老年人,在沒有dict comprehenions,你可以這樣做:

In [13]: resdict = dict((r['country'].upper(), r['count']) for r in result) 

In [14]: mainRes = dict((abbrev, resdict.get(country,0)) for country, abbrev in firstDict.items()) 
+1

考慮到像「Svalbard和Jan Mayen」這樣的名稱不會被'.capitalize正確地大寫,最好使用'r ['country']。upper()'' '。 – nneonneo

+0

@unutbu resdict = {r ['country']:r ['count'] for r in result} ...爲什麼這個語法在Python 2.6.5中是錯誤的 –

+0

@nneonneo:真的,謝謝nneonneo。 – unutbu

0

你可以嘗試像

mainRes = dict.fromkeys(firstDict.itervalues(), 0) 

for row in result: 
    countryCode = firstDict.get(row['country'].upper()) 
    if countryCode: 
     mainRes[countryCode] = row['count'] 
0

你不必去通陣列轉換。只需使用for循環:

import string 
desired_result = {} 
for c in result: 
    country = string.upper(c['country']) 
    if country in firstDict: 
    desired_result[firstDict[country]] = c['count'] 
print desired_result