Les nouvelles modifications de Python 3.9 dont la publication est prévue pour octobre 2020 sont résumées dans l'article Quoi de neuf dans Python 3.9 (Résumé) commencé. Parmi eux, j'ai décidé de découper une quantité relativement importante d'éléments dans un article séparé, mais dans un premier temps, j'aimerais reprendre le changement qui permet d'utiliser l'opérateur sum set dans le type dictionnaire.
Le type de dictionnaire est l'un des types de données standard intégrés à Python. Dans d'autres langages, il est appelé de différentes manières comme type de hachage, type de carte, type de tableau associatif, mais le fait est qu'il s'agit d'un type de données pour stocker des paires nom / valeur (paires clé-valeur).
Considérez qu'il existe deux données de type dictionnaire (d1, d2) et qu'elles sont mélangées en une seule donnée de type dictionnaire. Il existe plusieurs façons de procéder.
Si vous faites d1.update (d2) `, les données de type dictionnaire intégré seront écrasées et stockées dans d1. Si vous voulez garder d1 tel quel
e = d1.copy()
e.update(d2)
Vous devez faire une copie puis appeler la méthode ʻupdate`. C'est un peu gênant.
En tant que «{** d1, ** d2}», les données de contenu sont extraites de chaque type de dictionnaire et renvoyées dans un nouveau type de dictionnaire. Vous pouvez obtenir des données de dictionnaire intégrées sans variables intermédiaires, mais il est difficile de dire ce que vous faites en regardant Pat. Même Guido, l'auteur original de Python, est si déroutant qu'il dit: "J'ai oublié qu'il y avait un tel moyen" (rires).
collections.ChainMap
Le module collections
a une classe appelée ChainMap
, et si vous utilisezdict (ChainMap (d2, d1))
, vous pouvez obtenir des données de dictionnaire intégrées. La chose déroutante est que, contrairement à l'exemple ci-dessus, si vous avez la même clé, celle de gauche a la priorité. Bien que standard, vous devez importer le module collections
, et cette méthode n'est pas non plus très intuitive.
Il y a dict (mapping, ** kwarg)
dans le constructeur de type de dictionnaire, donc si vous l'utilisez pour créer dict (d1, ** d2)
, vous obtiendrez des données de type dictionnaire intégrées. En définissant «** d2», le contenu de «d2» est donné comme arguments de mot-clé et ajouté au contenu du premier argument («d1» ne change pas). Le problème avec cette méthode est que le contenu de d2
est donné comme arguments de mot-clé, donc il ne peut être intégré que si la clé est un type de dictionnaire de chaîne.
Pour les opérateurs utilisés dans le type Set|
Quand|=
Il y a, par exemple, vous pouvez l'utiliser comme ça.
>>> a = set((1,2,3))
>>> b = set((3,4,5))
>>> a | b
{1,2,3,4,5}
>>> a |= b
>>> a
{1,2,3,4,5}
C'est un opérateur d'ensemble de somme car il calcule la «somme» de deux ensembles. Le changement prévu pour 3.9 cette fois est d'utiliser cet opérateur d'ensemble de somme pour l'intégration des données du dictionnaire.
La spécification est très simple et la somme des deux données de type dictionnaire est prise comme le type Set. La différence avec Set est la correspondance lorsque les clés se chevauchent, et même si l'ensemble se chevauche, il suffit de ne pas compter deux fois, mais dans le cas du type dictionnaire, il y a des valeurs ainsi que des clés, donc laquelle utiliser Devient un problème. Avec ce changement, la valeur sur le côté droit de la formule est priorisée. C'est une image de chevauchement dans l'ordre de gauche et écrasant celle avec la même clé.
C'est plus rapide de le voir comme un exemple.
>>> c = {'a': 1, 'b': 2}
>>> d = {'b': 3, 'c': 7}
>>> c | d
{'a': 1, 'b': 3, 'c': 7}
>>> d | c
{'a': 1, 'b': 2, 'c': 7}
>>> c |= d
>>> c
{'a': 1, 'b': 3, 'c': 7}
Icic | d
Avec le résultat ded | c
Le fait que le résultat de soit différent (non convertible) est désagréable en tant qu'opérateur "somme", mais vous ne pouvez le considérer que comme tel.
J'expliquerai l'opérateur d'ensemble de somme qui sera introduit dans le type de dictionnaire en Python 3.9 basé sur le contenu de PEP-584. J'ai fait. Je pense que j'avais l'habitude d'utiliser dict.update
dans de nombreux cas, mais comme il rompt le type de dictionnaire d'origine, je pense qu'il existe diverses utilisations pour dessiner des opérations immuables dans une notation facile à comprendre.
Recommended Posts