Les vues de dictionnaire sont essentiellement ce que leur nom dit: les vues sont simplement comme une fenêtre sur les clés et les valeurs (ou éléments) d'un dictionnaire. Voici un extrait de la documentation officielle de Python 3:
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> keys # No eggs anymore!
dict_keys(['sausage', 'bacon', 'spam'])
>>> values # No eggs value (2) anymore!
dict_values([1, 1, 500])
(L'équivalent Python 2 utilise dishes.viewkeys()
et dishes.viewvalues()
.)
Cet exemple montre le caractère dynamique des vues : la vue des clés n'est pas une copie des clés à un moment donné, mais plutôt une simple fenêtre qui vous montre les clés; s'ils sont modifiés, ce que vous voyez à travers la fenêtre change également. Cette fonctionnalité peut être utile dans certaines circonstances (par exemple, on peut travailler avec une vue sur les clés dans plusieurs parties d'un programme au lieu de recalculer la liste actuelle des clés à chaque fois qu'elles sont nécessaires) - notez que si les clés du dictionnaire sont modifiées lors de l'itération sur la vue, le comportement de l'itérateur n'est pas bien défini, ce qui peut entraîner des erreurs .
Un avantage est que regarder , par exemple, les clés n'utilise qu'une petite quantité de mémoire fixe et nécessite une quantité de temps processeur faible et fixe , car il n'y a pas de création de liste de clés (Python 2, d'autre part, crée souvent inutilement une nouvelle liste, comme cité par Rajendran T, qui prend de la mémoire et du temps dans une quantité proportionnelle à la longueur de la liste). Pour continuer l'analogie de la fenêtre, si vous voulez voir un paysage derrière un mur, vous faites simplement une ouverture dedans (vous construisez une fenêtre); copier les clés dans une liste correspondrait à la peinture d'une copie du paysage sur votre mur - la copie prend du temps, de l'espace et ne se met pas à jour.
Pour résumer, les vues sont simplement… des vues (fenêtres) de votre dictionnaire, qui affichent le contenu du dictionnaire même après sa modification. Ils offrent des fonctionnalités qui diffèrent de celles des listes: une liste de clés contient une copie des clés du dictionnaire à un moment donné, tandis qu'une vue est dynamique et est beaucoup plus rapide à obtenir, car elle ne doit copier aucune donnée ( clés ou valeurs) afin d'être créé.
Comme vous l'avez mentionné,
dict.items()
retourne une copie de la liste des paires (clé, valeur) du dictionnaire, ce qui est inutile etdict.iteritems()
renvoie un itérateur sur les paires (clé, valeur) du dictionnaire.Prenons maintenant l'exemple suivant pour voir la différence entre un interator de dict et une vue de dict
Alors qu'une vue vous montre simplement ce qu'il y a dans le dict. Peu importe si cela a changé:
Une vue correspond simplement à ce à quoi ressemble le dictionnaire maintenant. Après la suppression, une entrée
.items()
aurait été obsolète et.iteritems()
aurait généré une erreur.la source
viewitems()
est donc correcte (items()
donne correctement une vue en Python 3 ).En lisant les documents, j'ai cette impression:
Donc, je suppose que le cas d'utilisation clé est si vous gardez un dictionnaire et répétez à plusieurs reprises ses clés / éléments / valeurs avec des modifications entre les deux. Vous pouvez simplement utiliser une vue à la place, en vous transformant
for k, v in mydict.iteritems():
enfor k, v in myview:
. Mais si vous ne faites qu'une itération sur le dictionnaire une fois, je pense que les versions itératives sont toujours préférables.la source
iteritems()
). Alors, quel est le point de ces vues? Quand suis-je content de les avoir?.values()
, mais cela implique d'en faire une copie complète sous forme de liste, ce qui pourrait coûter cher. Il y en a.itervalues()
mais vous ne pouvez pas les consommer plus d'une fois, donc cela ne fonctionnera pas avec toutes les fonctions. Les vues ne nécessitent pas de copie coûteuse, mais elles sont toujours plus utiles en tant que valeur autonome qu'un itérateur. Mais ils ne sont toujours pas destinés à aider à itérer et à modifier en même temps (là, vous voulez vraiment une copie).Les méthodes d'affichage renvoient une liste (non une copie de la liste, par rapport à
.keys()
,.items()
et.values()
), il est donc plus léger, mais reflète le contenu actuel du dictionnaire.Depuis Python 3.0 - les méthodes dict renvoient des vues - pourquoi?
la source
Les vues vous permettent d'accéder à la structure de données sous-jacente, sans la copier. En plus d'être dynamique par opposition à la création d'une liste, l'une de leurs utilisations les plus utiles est le
in
test. Supposons que vous souhaitiez vérifier si une valeur est dans le dict ou non (que ce soit une clé ou une valeur).La première option est de créer une liste des clés en utilisant
dict.keys()
, cela fonctionne mais consomme évidemment plus de mémoire. Si le dict est très grand? Ce serait un gaspillage.Avec
views
vous pouvez itérer la structure de données réelle, sans liste intermédiaire.Prenons des exemples. J'ai un dict avec 1000 clés de chaînes et de chiffres aléatoires et
k
c'est la clé que je veux rechercherComme vous pouvez le voir, l'itération d'un
view
objet donne un énorme coup de pouce aux performances, réduisant en même temps la charge mémoire. Vous devez les utiliser lorsque vous devez effectuer desSet
opérations similaires.Remarque : j'utilise Python 2.7
la source
.keys()
renvoie une vue par défaut. Pourrait vouloir vérifier thok
une des clés du dictionnairelarge_d
est censée être faite aveck in large_d
, en Python, ce qui est probablement essentiellement aussi rapide que l'utilisation d'une vue (en d'autres termes,k in large_d.keys()
n'est pas pythonique et doit être évité - tel quelk in large_d.viewkeys()
).k in large_d
est en fait beaucoup plus rapide quek in large_d.viewkeys()
, donc cela devrait probablement être évité, mais cela a du sens pourk in large_d.viewvalues()
.