2012-10-23 8 views
1

Le premier Dict est fixe. Ce dicton restera tel qu'il est dans la liste des pays avec des noms courts.Python: Comparaison de deux dictionnaires

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'} 

Toutefois, ce résultat Tuple a plusieurs Dict à l'intérieur patchage est le format dans lequel mysqldb renvoie le résultat:

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

Maintenant, je veux comparer ces deux résultats avec des noms de pays et de Si « Pays » dans le résultat est présent dans firstDict puis mettre le value.else a mis le 0 le résultat souhaité est:

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

Le résultat souhaité n'est pas cohérent. Vous demandez de mettre '0' ainsi que d'ignorer en même temps. Vérifiez s'il vous plaît. Je suppose que votre résultat devrait être ER 1 TG 1 BS 3 GH 1 –

+0

@AntonyThomas Désolé mon mauvais. J'ai cité la question dans le mauvais sens. Éditer –

Répondre

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} 

Dans python2.6 ou plus, où il n'y a pas dict comprehenions, vous pouvez faire:

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

Il est probablement préférable d'utiliser 'r ['country']. Upper()', étant donné qu'un nom comme "Svalbard et Jan Mayen" ne sera pas correctement capitalisé par '.capitalize '. – nneonneo

+0

@unutbu resdict = {r ['country']: r ['count'] pour r dans le résultat} ... Pourquoi cette syntaxe est fausse dans python 2.6.5 –

+0

@nneonneo: Vrai, merci nneonneo. – unutbu

0

Vous pouvez essayer quelque chose comme

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

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

Vous ne devez pas passer par la conversion de tableau. Utilisez simplement pour les boucles comme:

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 
Questions connexes