web-dev-qa-db-fra.com

dict.keys () [0] sur Python 3

J'ai cette phrase:

def Ciudad(prob):
    numero = random.random()
    ciudad = prob.keys()[0]
    for i in prob.keys():
        if(numero > prob[i]):
            if(prob[i] > prob[ciudad]):
                ciudad = i
        else:
            if(prob[i] > prob[ciudad]):
                ciudad = i

    return ciudad

Mais quand je l'appelle cette erreur apparaît:

TypeError: 'dict_keys' object does not support indexing

est-ce un problème de version? J'utilise Python 3.3.2

27
Menticolcito

dict.keys() est une vue du dictionnaire. Utilisez simplement list() directement sur le dictionnaire si vous avez besoin d’une liste de clés. L’article 0 sera la première clé dans l’ordre (arbitraire) du dictionnaire:

list(prob)[0]

ou mieux encore simplement utiliser:

next(iter(dict))

Quelle que soit la méthode utilisée, Python 2 et 3, l'option next() est certainement plus efficace pour Python 2 que d'utiliser dict.keys(). Notez cependant que les dictionnaires ont non un ordre défini et que vous pas savez quelle clé sera listée en premier.

Il semble que si vous essayez plutôt de trouver la clé maximum, utilisez max() avec dict.get:

def Ciudad(prob):
    return max(prob, key=prob.get)

Le résultat de la fonction sera certainement le même pour tout dictionnaire prob donné, car votre code ne diffère pas en termes de chemin de code entre les branches de comparaison de nombres aléatoires de l'instruction if.

51
Martijn Pieters

Dans Python 3.x, dict.keys() ne retourne pas de liste, il retourne une variable (en particulier, une vue du dictionnaire ). Dans la plupart des cas, utiliser directement dict est préférable, car il s'agit d'un itératif lui-même et nécessite moins de code.

Si vous souhaitez obtenir un seul élément arbitraire (les dictionnaires étant non ordonnés, l'ordre est arbitraire, le premier élément est donc arbitraire), utilisez plutôt next(iter(dict)).

(Nous prenons l'itérable de la vue du dictionnaire, puis utilisons next() pour le faire avancer d'un élément et prenons l'élément).

Si vous avez besoin de parcourir les éléments, il suffit de les parcourir directement au-dessus de dict.

Ces fonctions sont toutes avantageuses si vous utilisez list() car cela signifie qu'une liste n'est pas construite - ce qui la rend plus rapide et plus efficace en termes de mémoire (d'où la modification du comportement par défaut de keys() dans la version 3.x).

6
Gareth Latty

J'ai réussi à transformer les itérables tirées d'un dictionnaire en liste ..__ Ainsi, pour dic.keys (), dic.values ​​() et dic.items (), en Python3.6, vous pouvez:

dic = {'a':3, 'b':2, 'c':3}
print(dic)

dictkeys = dic.keys() # or values/items
print(dictkeys)

keylist = []
keylist.extend(iter(dictkeys)) # my big revelation
print('keylist', keylist)
0
Tim Pozza