Nouveau dans les dictionnaires de fusion python3.9

Nouveau dans les dictionnaires de fusion python3.9

Aperçu

Python 3.9 est sorti le 5 octobre 2020. L'une des nouvelles fonctionnalités cette fois-ci est l'opérateur de fusion dict. Cet opérateur de fusion facilite plus que jamais la fusion de dictionnaires.

Construction de l'environnement d'essai (Docker requis)

Vous pouvez exécuter Python 3.9 sur un conteneur Docker en suivant les étapes ci-dessous. Les étapes suivantes fonctionnent sur le conteneur Docker afin que vous puissiez valider Python 3.9 sans mettre à jour la version hôte de Python.

1. Créez un compte pour docker hub (uniquement si vous n'en avez pas).

2. connexion docker depuis le terminal

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: #Entrez votre nom d'utilisateur Docker Hub ici et appuyez sur Entrée
Password: #Entrez le mot de passe du hub docker ici et appuyez sur Entrée

Si l'écran suivant apparaît, la connexion est réussie

Login Succeeded

3. Extrayez l'image Docker python3.9 du hub docker

$ docker pull python:3.9
 3.9: Pulling from library/python
e4c3d3e4f7b0: Pull complete 
101c41d0463b: Pull complete 
8275efcd805f: Pull complete 
751620502a7a: Pull complete 
0a5e725150a2: Pull complete 
397dba5694db: Pull complete 
b1d09d0eabcb: Pull complete 
475299e7c7f3: Pull complete 
d2fe14d8e6bc: Pull complete 
Digest: sha256:429b2fd1f6657e4176d81815dc9e66477d74f8cbf986883c024c9b97f7d4d5a6
Status: Downloaded newer image for python:3.9
docker.io/library/python:3.9

4. Démarrez le conteneur à partir de l'image du docker et démarrez Python dans le conteneur en mode interactif.

$ docker run -it python:3.9 python3
Python 3.9.0 (default, Oct 13 2020, 20:14:06)  # ←Python3.9 est en cours d'exécution
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Opérateur de fusion

Prenons le cas de la combinaison de deux dictionnaires pour en faire un seul.

>> dict_1 = {"name": "Alice", "age": 29}
>> dict_2 = {"mail": "[email protected]", "tel": "000-0000-0000"}

#Combinez les deux dictionnaires ci-dessus pour créer le dict suivant
dict_3 = {'name': 'Alice', 'age': 29, 'mail': '[email protected]', 'tel': '000-0000-0000'}

En Python traditionnel, parcourir les éléments dict et attribuer les éléments dict_2 à dict_1 un par un.

>> dict_3 = dict_1.copy() # dict_3 = dict_1 est dict_Notez que 1 est également réécrit
>>> for key, value in dict_2.items():
...   dict_3[key] = value
...
>>> dict_3
{'name': 'Alice', 'age': 29, 'mail': '[email protected]', 'tel': '000-0000-0000'}
>>> dict_1
{'name': 'Alice', 'age': 29} #Dict après la fusion_1 ne change pas
>>> dict_2
{'mail': '[email protected]', 'tel': '000-0000-0000'} #Dict après la fusion_2 ne change pas

Dans Python 3.9, le processus ci-dessus est effectué uniquement par l'opérateur de fusion.

>>> dict_3 = dict_1 | dict_2 # |Est l'opérateur de fusion
>>> dict_3
{'name': 'Alice', 'age': 29, 'mail': '[email protected]', 'tel': '000-0000-0000'}

En utilisant l'opérateur de fusion, le processus de fusion de dict_1 et dict_2 peut être décrit en une seule ligne. Si la même clé existe dans deux dictionnaires, la valeur fusionnée sera sur le côté droit (dernière victoire).

>>> dict_1 = {"name": "Alice", "age": "29"}
>>> dict_2 = {"mail": "[email protected]", "tel": "000-0000-0000", "age": 30} # "age"Est dict_1 et dict_Inclus dans les deux 2
>>> dict_1 | dict_2
{'name': 'Alice', 'age': 30, 'mail': '[email protected]', 'tel': '000-0000-0000'} #l'âge est dict_C'est devenu 2
>>> dict_1 = {"name": "Alice", "age": "29"}
>>> dict_2 = {"mail": "[email protected]", "tel": "000-0000-0000", "age": None}
>>> dict_1 | dict_2
{'name': 'Alice', 'age': None, 'mail': '[email protected]', 'tel': '000-0000-0000'} #Notez que même si la valeur à droite est None, elle sera incluse dans le dictionnaire fusionné.(Pas la valeur sur le côté gauche)

Instruction d'affectation de l'opérateur de fusion

Comme avec d'autres opérateurs tels que + et-, vous pouvez affecter le dict fusionné au côté gauche en ajoutant =.

>>> dict_1 = {"name": "Alice", "age": 29}
>>> dict_2 = {"mail": "[email protected]", "tel": "000-0000-0000"}
>>> id(dict_1), id(dict_2)
(140606638257856, 140606638701760)
>>> dict_1 |= dict_2 # dict_1 et dict_Dicter le résultat de la fusion 2_Remplacer par 1
>>> dict_1
{'name': 'Alice', 'age': 29, 'mail': '[email protected]', 'tel': '000-0000-0000'} # dict_1 est réécrit
>>> dict_2
{'mail': '[email protected]', 'tel': '000-0000-0000'} # dict_2 ne change pas
>>> id(dict_1), id(dict_2)
(140606638257856, 140606638701760) #id est le même avant et après le calcul

Opérateur de fusion et OrderedDict

L'opérateur de fusion peut également être utilisé pour OrderedDict.

>>> from collections import OrderedDict
>>> o_dict_1 = OrderedDict({'name': 'Alice', 'age': 29})
>>> o_dict_2 = OrderedDict({'mail': '[email protected]', 'tel': '000-0000-0000'})
>>> o_dict_1
OrderedDict([('name', 'Alice'), ('age', 29)])
>>> o_dict_1 | o_dict_2
OrderedDict([('name', 'Alice'), ('age', 29), ('mail', '[email protected]'), ('tel', '000-0000-0000')])

S'il y a une clé commune aux côtés gauche et droit, l'ordre sera le côté gauche et la valeur sera le côté droit. Les clés contenues uniquement sur le côté droit sont ajoutées à la fin dans l'ordre du côté droit.

>>> from collections import OrderedDict
>>> o_dict_1 = OrderedDict({'name': 'Alice', 'age': 29})
>>> o_dict_2 = OrderedDict({'mail': '[email protected]', 'age': 30, 'name': 'Bob', 'tel': '000-0000-0000'})
>>> o_dict_1 | o_dict_2
OrderedDict([('name', 'Bob'), ('age', 30), ('mail', '[email protected]'), ('tel', '000-0000-0000')])
# age,le nom est o_dict_O dans l'ordre de 1_dict_Ils sont alignés avec une valeur de 2.
# dict_Courrier inclus uniquement dans 2,tel est o_dict_Ajouté à la fin dans l'ordre de 2

Recommended Posts

Nouveau dans les dictionnaires de fusion python3.9
Quoi de neuf dans Python 3.5
Quoi de neuf dans Python 3.6
Nouveautés de Python 3.10 (Résumé)
Nouveau dans Python 3.4.0 (2) --enum
Nouveautés de Python 3.9 (Résumé)
Nouveau dans Python 3.4.0 (1) --pathlib
Quoi de neuf dans datetime qui est un peu plus utile dans Python 3
Nouveautés de Python 3.9 (2) - Tri des graphes non circulés dirigés en Python
Nouveau dans Django 1.8 Expressions conditionnelles #djangoja
Nouvelles fonctionnalités de Python 3.4.0 (3) - Fonctions génériques à distribution unique
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Un mémo que j'ai écrit un tri de fusion en Python
Je veux fusionner des dictionnaires imbriqués en Python
Créer une nouvelle page en confluence avec Python
Liste triée en Python
AtCoder # 36 quotidien avec Python
Texte de cluster en Python