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 .