una tuplas recorrer por llenar listas lista elementos ejemplo diccionarios diccionario comprensión agregar python dictionary tuples namedtuple

tuplas - recorrer diccionario python



pitón llamada tupla al diccionario (4)

Tengo una clase de tupla nombrada en python

class Town(collections.namedtuple(''Town'', [ ''name'', ''population'', ''coordinates'', ''population'', ''capital'', ''state_bird''])): # ...

Lo que me gustaría hacer es convertir esto en un diccionario. Admitiré que Python no es uno de mis idiomas más fuertes. La clave es que no quiero que esté rígidamente ligado al nombre o números de los campos que tengo.

¿Hay alguna forma de escribirlo para poder agregar más campos o pasar una tupla con nombre completamente diferente y obtener un diccionario?

Editar: No puedo alterar la definición de clase original como está en el código de otra persona. Entonces necesito tomar una instancia de un pueblo y convertirlo a un diccionario.


En las versiones Ubuntu 14.04 LTS de python2.7 y python3.4, la propiedad __dict__ funcionó como se esperaba. El método _asdict también funcionó, pero me inclino a usar la api de propiedad uniforme, definida por los estándares, en lugar de la API localizada no uniforme.

$ python2.7

# Works on: # Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 # Python 3.4.3 (default, Oct 14 2015, 20:28:29) [GCC 4.8.4] on linux import collections Color = collections.namedtuple(''Color'', [''r'', ''g'', ''b'']) red = Color(r=256, g=0, b=0) # Access the namedtuple as a dict print(red.__dict__[''r'']) # 256 # Drop the namedtuple only keeping the dict red = red.__dict__ print(red[''r'']) #256

Ver como dict es la forma semántica de hacer que un diccionario represente algo, (al menos según mi leal saber y entender).

Sería bueno acumular una tabla de las principales plataformas y versiones de python y su compatibilidad con __dict__ , actualmente solo tengo una versión de plataforma y dos versiones de python como las publicadas anteriormente.

| Platform | PyVer | __dict__ | _asdict | | ------------- | --------- | -------- | ------- | | Ubuntu 14.04 LTS | Python2.7 | yes | yes | | Ubuntu 14.04 LTS | Python3.4 | yes | yes |


Hay un método namedtuple instancias namedtuple para esto, _asdict .

Como se discutió en los comentarios, en algunas versiones vars() también lo hará, pero aparentemente depende en gran medida de los detalles de construcción, mientras que _asdict debería ser confiable. En algunas versiones _asdict se marcó como obsoleto, pero los comentarios indican que este ya no es el caso a partir de 3.4.


Python 3. Asigne cualquier campo al diccionario como el índice requerido para el diccionario, utilicé ''nombre''.

import collections Town = collections.namedtuple("Town", "name population coordinates capital state_bird") town_list = [] town_list.append(Town(''Town 1'', ''10'', ''10.10'', ''Capital 1'', ''Turkey'')) town_list.append(Town(''Town 2'', ''11'', ''11.11'', ''Capital 2'', ''Duck'')) town_dictionary = {t.name: t for t in town_list}


TL; DR: hay un método _asdict proporcionado para esto.

Aquí hay una demostración del uso:

>>> fields = [''name'', ''population'', ''coordinates'', ''capital'', ''state_bird''] >>> Town = collections.namedtuple(''Town'', fields) >>> funkytown = Town(''funky'', 300, ''somewhere'', ''lipps'', ''chicken'') >>> funkytown._asdict() OrderedDict([(''name'', ''funky''), (''population'', 300), (''coordinates'', ''somewhere''), (''capital'', ''lipps''), (''state_bird'', ''chicken'')])

Este es un método documentado de namedtuples, es decir, a diferencia de la convención habitual en python, el subrayado inicial del nombre del método no está ahí para desalentar el uso . Junto con los otros métodos agregados a namedtuples, _make , _replace , _source , _fields , tiene el guión bajo solo para intentar evitar conflictos con posibles nombres de campo.

Nota: Para algunos 2.7.5 <versión de python <3.5.0 código en la naturaleza, es posible que vea esta versión:

>>> vars(funkytown) OrderedDict([(''name'', ''funky''), (''population'', 300), (''coordinates'', ''somewhere''), (''capital'', ''lipps''), (''state_bird'', ''chicken'')])

Durante un tiempo la documentación mencionó que _asdict was obsolete (ver here ), y sugirió usar el método incorporado vars . Ese consejo ahora está desactualizado; para corregir un error relacionado con la __dict__ subclases, la propiedad __dict__ que estaba presente en namedtuples ha sido nuevamente eliminada por este commit .