2012-03-26 13 views
113

Duplicar posibles:
What are “named tuples” in Python?¿Cuándo y por qué debería usar una ruta de acceso nombrada en lugar de un diccionario?

¿Cuál es la situación en la que se debe utilizar un namedtuple?

Cuando lo analicé, parecía una forma de hacer tuplas más como diccionarios. ¿Cómo se comparan con los diccionarios?

¿Solo se pueden usar los mismos tipos de caracteres almohadillados para diccionarios para namedtuples?

+0

Eche un vistazo a esta pregunta - http://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python – ronakg

+0

Esto no es un duplicado de [la pregunta mencionada arriba] (https://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python). Los dos son complementarios. – Dennis

Respuesta

156

En dict s, solo las claves tienen que ser transitables, no los valores. namedtuple s no tienen llaves, por lo que la capacidad de transferencia no es un problema.

Sin embargo, tienen una restricción más estricta: sus equivalentes clave, "nombres de campo", tienen que ser cadenas.

Básicamente, si se va a crear un montón de instancias de una clase como:

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) 

y no cambia los atributos de una vez establecidos en __init__, se puede utilizar en lugar

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

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

como reemplazo.

Por supuesto, se podría crear un montón de dict s donde se utilizó el mismo claves en cada uno, pero suponiendo que sólo tendrá identificadores Python válidos como llaves y no necesita mutabilidad,

mynamedtuple.fieldname 

es más bonita que

mydict['fieldname'] 

y

mynamedtuple = MyNamedTuple(firstvalue, secondvalue) 

es más bonita que

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

Por último, namedtuple s están ordenados, a diferencia regulares dict s, por lo que obtener los elementos en el orden definido por los campos, a diferencia de un dict.

+16

También, citando a Raymondh: "Las instancias de tuplas con nombre no usan más espacio que las tuplas regulares. Las propiedades del nombre del campo se almacenan en la clase namedtuple". https: // twitter.com/raymondh/status/524660721968107521 – Moberg

+0

Una cosa más a tener en cuenta es que la tupla nombrada también se puede inicializar como 'mynamedtuple = MyNamedTuple (fieldname = firstvalue, secondfield = secondvalue)' –

26

Las tuplas son inmutables, ya sean con nombre o no. namedtuple solo hace que el acceso sea más conveniente al usar nombres en lugar de índices. Solo puede usar identificadores válidos para namedtuple, no realiza ningún hash, sino que genera un nuevo tipo.

Cuestiones relacionadas