174 votes

Quand et pourquoi devrais-je utiliser un namedtuple au lieu d'un dictionnaire?

Dupliquer possible:
Que sont les "tuples nommés" en Python?

Quelle est la situation où un nom nommé doit être utilisé?

Lorsque j'ai examiné la question, cela semblait être un moyen de transformer les n-uplets en dictionnaires. Comment se comparent-ils aux dictionnaires?

Ne peut-on utiliser que les mêmes types de mots de passe pour les dictionnaires pour les éléments nommés?

209voto

agf Points 45052

En dicts, seules les clés doivent être hashable, pas les valeurs. namedtuples n'ont pas de touches, donc hashability n'est pas un problème.

Cependant, ils ont une plus strictes de restriction -- clés de leurs équivalents, "les noms de champ", doivent être des chaînes de caractères.

En gros, si vous aviez l'intention de créer un groupe d'instances d'une classe comme:

class Container:
    def __init__(self, name, date, foo, bar):
        self.name = name
        self.date = date
        self.foo = foo
        self.bar = bar

mycontainer = Container(name, date, foo, bar)

et de ne pas modifier les attributs d'après vous les mettez en __init__, vous pouvez utiliser

Container = namedtuple('Container', ['name', 'date', 'foo', 'bar'])

mycontainer = Container(name, date, foo, bar)

comme un remplacement.

Bien sûr, vous pouvez créer un groupe d' dicts où vous avez utilisé les mêmes clés dans chacun d'eux, mais en supposant que vous aurez seulement valide identifiants Python que les clés et n'ont pas besoin de la mutabilité,

mynamedtuple.fieldname

est plus jolie que

mydict['fieldname']

et

mynamedtuple = MyNamedTuple(firstvalue, secondvalue)

est plus jolie que

mydict = {'fieldname': firstvalue, 'secondfield': secondvalue}

Enfin, namedtuples sont commandés, contrairement à des dicts, de sorte que vous obtenez les articles dans l'ordre que vous avez défini les champs, à la différence d'un dict.

35voto

Cat Plus Plus Points 53385

Les tuples sont immuables, qu'ils soient nommés ou non. namedtuple ne fait que rendre l'accès plus pratique, en utilisant des noms plutôt que des index. Vous ne pouvez utiliser que des identifiants valides pour namedtuple , il n'effectue aucun hachage - il génère un nouveau type à la place.

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