2012-10-23 153 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