171 votes

Quels sont les objets de vue dictionnaire Python ?

En python 2.7, nous avons obtenu le dictionnaire de vue des méthodes disponibles.

Maintenant, je sais que les pro et les inconvénients de l'suivantes:

  • dict.items() (et values, keys): retourne une liste, de sorte que vous pouvez stocker le résultat
  • dict.iteritems() (): retourne un générateur, de sorte que vous pouvez itérable chaque valeur généré un par un.

Quelles sont dict.viewitems() (et autres)? Quels sont leurs avantages? Comment ça fonctionne? Qu'est ce qu'une vue?

J'ai lu que la vue est toujours reflétant les changements dans le dictionnaire. Mais comment fait-il se comporter de la perf et la mémoire de point de vue? Quelles sont les pro et les inconvénients?

175voto

EOL Points 24342

Dictionnaire de points de vue sont essentiellement ce que leur nom indique: des vues sont tout simplement comme une fenêtre sur les clés et les valeurs (ou des é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])

(Le Python 2 équivalent utilise dishes.viewkeys() et dishes.viewvalues().)

Cet exemple illustre le caractère dynamique de vues: les clés de la vue n'est pas une copie des clés à un moment donné dans le temps, mais plutôt une simple fenêtre qui vous montre les clés, si elles sont modifiées, alors ce que vous voyez dans la fenêtre de modification. Cette fonction peut être utile dans certaines circonstances (par exemple, on peut travailler avec une vue sur les touches dans plusieurs parties d'un programme au lieu de recalculer la liste actuelle des touches à chaque fois qu'ils sont nécessaires).

Un avantage est que la recherche , par exemple, les touches utilise seulement une petite quantité de mémoire fixe et nécessite une petite et le montant fixe de temps processeur, comme il n'y a pas de création d'une liste de clés (Python 2, d'autre part, souvent inutilement crée une nouvelle liste, cité par Rajendran T, qui prend de la mémoire et le temps dans une quantité proportionnelle à la longueur de la liste). Pour continuer la fenêtre analogie, si vous voulez voir un paysage derrière un mur, il vous suffit de faire une ouverture dans celle-ci (vous créez une fenêtre); la copie de l'clés dans une liste correspondrait à la place de la peinture une copie du paysage sur votre mur-la copie prend du temps, de l'espace, et ne pas se mettre à jour.

Pour résumer, les vues sont tout simplement... des idées (windows) sur votre dictionnaire, qui montrent le contenu du dictionnaire, même après les changements. Ils offrent des caractéristiques qui diffèrent de celles de des listes: une liste de clés contient une copie des clés de dictionnaire, à un moment donné dans le temps, tandis qu'un affichage est dynamique et est beaucoup plus rapide à obtenir, car il n'a pas à copier les données (clés ou valeurs) afin d'être créé.

22voto

Martin Konecny Points 7328

Comme vous l'avez mentionné dict.items() renvoie une copie du dictionnaire de la liste des (clé, valeur) des paires, qui est un gaspillage dict.iteritems() renvoie un itérateur sur le dictionnaire (clé, valeur) paires.

Maintenant, prenons l'exemple suivant pour voir la différence entre un interator de dict et une vue de la dict

>>> d = {"x":5, "y":3}
>>> iter = d.iteritems()
>>> del d["x"]
>>> for i in iter: print i
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

Alors qu'une vue vous montre simplement ce qui est dans le dict. Il ne se soucie pas si ça a changé:

>>> d = {"x":5, "y":3}
>>> v = d.viewitems()
>>> v
dict_items([('y', 3), ('x', 5)])
>>> del d["x"]
>>> v
dict_items([('y', 3)])

Une vue est simplement ce que le dictionnaire ressemble maintenant. Après la suppression d'une entrée .items() aurait été out-of-date et l' .iteritems() aurait jeté une erreur.

21voto

Ben Points 22160

Juste en lisant les docs que j'ai donne cette impression:

  1. Les vues sont des "pseudo-set-like", en ce qu'elles ne prennent pas en charge l'indexation, de sorte que vous pouvez faire avec eux, c'est de tester pour l'adhésion et itérer sur eux (parce que les touches sont hashable et unique, les clés et les éléments de vues sont plus de "like" en ce qu'ils ne contiennent pas de doublons).
  2. Vous pouvez les stocker et de les utiliser à plusieurs reprises, comme la liste des versions.
  3. Parce qu'ils reflètent le dictionnaire sous-jacent, tout changement dans le dictionnaire de modifier la vue, et sera presque certainement modifier l'ordre d'itération. Donc, contrairement à la liste des versions, ils ne sont pas "stables".
  4. Parce qu'ils reflètent le dictionnaire sous-jacent, ils sont presque certainement les petits objets proxy; la copie de clés/valeurs/exigera qu'ils regardent le dictionnaire original en quelque sorte et de le copier à plusieurs reprises lorsque des changements se produisent, ce qui serait absurde de mise en œuvre. Donc je m'attends très peu de surcharge de la mémoire, mais l'accès à l'être un peu plus lent que directement au dictionnaire.

Donc je suppose que la clé de cas d'utilisation est si vous êtes en gardant un dictionnaire autour et à plusieurs reprises une itération sur ses touches/objets/valeurs avec des modifications entre les deux. Vous pouvez simplement utiliser une vue à la place, tourner for k, v in mydict.iteritems(): en for k, v in myview:. Mais si vous êtes juste de parcourir le dictionnaire une fois, je pense que l'iter - les versions sont toujours préférables.

15voto

Rajendran T Points 832

Le point de vue des méthodes renvoient une liste(pas une copie de la liste, par rapport à l' .keys(), .items() et .values()), de sorte qu'il est plus léger, mais reflète le contenu du dictionnaire.

À partir de Python 3.0 - dict méthodes retournent des points de vue - pourquoi?

La raison principale est que, pour de nombreux cas d'utilisation de retourner complètement détaché liste est inutiles et coûteux. Elle aurait besoin de la copie l'ensemble du contenu (qui peut être ou ne pas être beaucoup).

Si vous souhaitez simplement effectuer une itération sur les touches, puis la création d'une nouvelle liste n'est pas nécessaire. Et si vous avez en effet besoin que d'une liste séparée (comme un copier) puis vous pouvez facilement créer cette liste à partir de la vue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X