2015-04-07 6 views
0

j'ai un dictionnaire qui a une lettre et une coordonnée, comme suit:Remplir une liste avec une clé de dictionnaire dans un ordre spécifique en Python

alfacor = {'a': [1, 1], 'c': [1, 3], 'b': [1, 2]...} 

, j'ai une liste dans le format suivant

final_list = [[2, 2], [3, 4], [3, 5], [4, 3], [3, 3], [1, 1], [1, 4], [1, 3], [3, 4]] 

Enfin une boucle devrait faire l'affaire, mais aparently je manque quelque chose

for l, c in alfacor.iteritems(): 
    if c in final_list: 
     encripta_f.append(l) 

sortie

['a', 'c', 'd', 'g', 'o', 'n', 'p', 's'] 

Sortie prévue

[g, o, p, s, n, a, d, c, o] 

Je vois que final_list il a été mis dans l'ordre folowing et aussi des éléments répétés sont été ignorer, des idées sur la façon d'obtenir le résultat attendu

[[1, 1], [1, 3], [1, 4], [2, 2], [3, 4], [3, 3], [3, 5], [4, 3]] 
+1

publier l'entrée exacte. Quelle est votre sortie finale attendue? –

+0

Quelle est la valeur de la variable 'alfacor'? –

+0

l'entrée d'extact est: 'final_list = [[2, 2], [3, 4], [3, 5], [4, 3], [3, 3], [1, 1], [1, 4 ], [1, 3], [3, 4]] '. Je voudrais itérer 'final_list' sur la valeur de mon dictionnaire ('alfacor') afin que je puisse obtenir chaque correspondance correspondant à cette coordonnée spécifique (' final_list') dans l'ordre 'final_list' – etsous

Répondre

2

Les dictionnaires en Python n'ont pas d'ordre d'itération défini, que vous les itérez directement (for key in some_dict:) ou en utilisant items() ou iteritems(). Si vous voulez parcourir le dictionnaire dans un ordre particulier, vous devez le faire vous-même.

Dans ce cas, il semble que vous souhaitiez que les touches dans l'ordre des éléments de final_list correspondent? Si tel est le cas, vous devez parcourir le final_list et vérifier si chacune de ses valeurs est une valeur dans alfacor, puis générer la clé correspondante.

Pour ce faire, vous devez inverser le dictionnaire. (Ceci n'est sûr que si vous n'avez pas de doublons dans le dictionnaire, ce que je ne peux pas dire si vous le faites ou pas ici.)

Pour cela, vous devez avoir des valeurs dans le dictionnaire qui est hashable (fondamentalement, ils doivent être immuables). Tuples fera l'affaire, mais ne sont pas égaux tuples à des listes avec le même contenu:

>>> [1, 2] == (1, 2) 
False 

vous aurez donc besoin de convertir les éléments en final_list à tuples, aussi, pour obtenir l'égalité de travailler.

Tous ensemble, quelque chose comme ça devrait faire l'affaire:

# invert the `alfacor` dict, and conver its 
# values to tuples which are hashable 
inv_alfacor = {} 
for letter, coordinate in alfacor.iteritems(): 
    inv_alfacor[tuple(coordinate)] = letter 

# now build the output list in the order of the 
# input list, converting the coordinates from 
# final_list to tuples since lists and tuples 
# are never equal 
encripta_f = [] 
for element in final_list: 
    element = tuple(element) 
    if element in inv_alfacor: 
     encripta_f.append(inv_alfacor[element])