Maison  >  Article  >  développement back-end  >  Comment utiliser des tuples nommés Python

Comment utiliser des tuples nommés Python

王林
王林avant
2023-05-02 23:13:051533parcourir

collections.namedtuple est utilisé pour construire des tuples avec des noms de champs. Le type correspondant est typing.NamedTuple (peut être utilisé comme superclasse).

nommé Tuple

Definition de l'objet NamedTuple:

Collections.NamedTuple (typename, field_ames, verbose = false, rename = false, defaults = non, module = non field_names : est une séquence de champs (par exemple, [‘x’, ‘y’]) ;

  • rename : lorsqu'ils sont vrais, les noms de champs non valides (par exemple, noms ou mots-clés en double) seront automatiquement remplacés par le nom de position (par exemple, _1) ;

  • defaults : la valeur par défaut du champ s'il s'agit d'un objet itérable, elle correspond à la valeur par défaut du champ dans field_names à son tour ; à partir d'un objet itérable (Iterable) Tuple nommé :

    from collections import namedtuple
    
    Color = namedtuple("Color", "r g b alpha")
    
    def convert_to_color(desc: str, alpha: float = 0.0):
        if desc == "green":
            return Color(r=50, g=205, b=50, alpha=alpha)
        elif desc == "blue":
            return Color(r=50, g=0, b=255, alpha=alpha)
        else:
            return Color(r=50, g=0, b=0, alpha=alpha)
  • Opération de tuple
  • Modification de tuple nommé : La valeur à l'intérieur ne peut pas être modifiée directement Vous pouvez en construire une nouvelle via _replace :

    c = Color._make([10, 20, 30, 0.1])
    nc = Color._make((10, 20, 30, 0.1))
    
    print("r:", c.r)
  • Convertir le dictionnaire en un tuple nommé :
  • c = {"r": 50, "g": 205, "b": 50, "alpha": 0.5}
    nc = c._replace(r=100)

    Tuple nommé Convertir en dictionnaire (via la méthode _asdict) :

    c = {"r": 50, "g": 205, "b": 50, "alpha": 0.5}
    nc = Color(**c)
  • Tuple nommé Convertir en tuple :
c = Color(r=50, g=0, b=0, alpha=0.5)
d = c._asdict()

Properties

Properties _fields Un tuple contenant tous les champs : tels que ('r', 'g', ' b', 'alpha');

l'attribut __annotations__ contient un dictionnaire de champs et de types correspondants : tels que {'r' : e13446bebb88208a1ed1b67eb6c71d15, 'g' :

Attribut _field_defaults garantit des champs avec des valeurs initiales et un dictionnaire de valeurs initiales : tel as { 'alpha': 0.0};

  • Trier

  • Tri des tuples nommés : le champ de tri peut être spécifié via l'attribut dans la bibliothèque de l'opérateur :
  • c = Color(r=50, g=0, b=0, alpha=0.5)
    t = tuple(c)

    Comparaison avec le dictionnaire

  • Le dictionnaire dict est une structure de données très générale , très Il est facile d'en abuser, et par rapport au nommé tuple, il présente les problèmes suivants :
  • Le dictionnaire n'est pas hachable, il ne peut donc pas être stocké dans un ensemble ou d'autres dictionnaires

Le dictionnaire est mutable ; , et n'importe quel nombre peut être ajouté selon les besoins. Nouvelles clés pour 

Semblable à dict, les valeurs du tuple nommé peuvent être attribuées à des variables individuelles et utilisées selon les besoins. Cependant :

    namedtuple est immuable et de nouvelles valeurs (clés) ne seront pas ajoutées accidentellement ;
  • Classe de données

  • Pour plus de détails sur les classes de données, veuillez vous référer à "Introduction aux classes de données".
  • modification de la classe de données

  • La classe de données a été introduite dans python3.7, qui peut être considérée comme un "tuple de variable nommé avec une valeur par défaut" :

peut facilement ajouter un document

peut être défini Sélectionnez un champ ;

from operator import attrgetter

colors = [
    Color(r=50, g=205, b=50, alpha=0.1),
    Color(r=50, g=205, b=50, alpha=0.5),
    Color(r=50, g=0, b=0, alpha=0.3)
]
out = sorted(colors, key=attrgetter("alpha"))
print(out)

Inherit NamedTuple

Il peut également être facilement défini en héritant de NamedTuple (en même temps, la valeur initiale du champ peut être définie, et les champs avec des valeurs initiales doivent suivre les champs non initiaux) :
    from dataclasses import dataclass
    
    # frozen设为true后,字段内容将不允许修改(与namedtuple完全类似)
    # 否则可修改字段;并可任意添加字段(如,c.n=1);
    @dataclass(frozen=True)
    class DColor:
        """A regular class that represents a color."""
        r: float
        g: float
        b: float
        alpha: float = 0.0
    
    # c = DColor(r=10, g=20, b=30)
    c = DColor(10, 20, 30)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer