2011-07-04 9 views
25

Mam moduł z kolekcji:Pierwsze imię wartości od namedtuple

import collections 
named_tuple_sex = collections.namedtuple(
        'FlightsResultsSorter', 
         ['TotalPriceASC', 
         'TransfersASC', 
         'FlightTimeASC', 
         'DepartureTimeASC', 
         'DepartureTimeDESC', 
         'ArrivalTimeASC', 
         'ArrivalTimeDESC', 
         'Airlines'] 
        ) 
FlightsResultsSorter = named_tuple_sex(
    FlightsResultsSorter('TotalPrice', SortOrder.ASC), 
    FlightsResultsSorter('Transfers', SortOrder.ASC), 
    FlightsResultsSorter('FlightTime', SortOrder.ASC), 
    FlightsResultsSorter('DepartureTime', SortOrder.ASC), 
    FlightsResultsSorter('DepartureTime', SortOrder.DESC), 
    FlightsResultsSorter('ArrivalTime', SortOrder.ASC), 
    FlightsResultsSorter('ArrivalTime', SortOrder.DESC), 
    FlightsResultsSorter('Airlines', SortOrder.ASC) 
) 

i w innym module I iteracyjne o tej kolekcji i chcę uzyskać nazwę elementu:

for x in FlightsResultsSorter: 
      self.sort(x) 

więc w po kodzie chcę zamiast tego x (który jest obiektem) przekazuje na przykład "WyjazdTimeASC" lub "ArrivalTimeASC".

Jak mogę uzyskać tę nazwę?

poważaniem

Odpowiedz

23
from itertools import izip 

for x, field in izip(FlightsResultsSorter, named_tuple_sex._fields): 
    print x, field 

Można również użyć FlightsResultsSorter._asdict() dostać dict.

+0

Czy jest jakikolwiek inny sposób, aby to zrobić bez uzyskiwania dostępu do prywatnego członka namedtuple? – user3885927

+2

nie są one uważane za członków prywatnych - konwencja _ służy tylko unikaniu kolizji z, powiedzmy, polem zwanym _fields. –

48

Jeśli próbujesz uzyskać rzeczywiste nazwiska, użyj atrybutu _fields:

In [50]: point = collections.namedtuple('point', 'x, y') 

In [51]: p = point(x=1, y=2) 

In [52]: for name in p._fields: 
    ....:  print name, getattr(p, name) 
    ....: 
x 1 
y 2