Using namedtuples field names for column indices in a list of lists
Erik
python at lucidity.plus.com
Mon Jan 9 20:47:00 EST 2017
On 10/01/17 00:54, Deborah Swanson wrote:
> Since I won't change the order of the records again after the sort, I'm
> using
>
> records.sort(key=operator.attrgetter("Description", "Date"))
>
> once, which also works perfectly.
>
> So both sorted() and sort() can be used to sort namedtuples. Good to
> know!
As people keep saying, the object you have called 'records' is a *list*
of namedtuple objects. It is not a namedtuple.
IIRC, you create it using a list comprehension which creates the
records. A list comprehension always creates a list.
The sorted() function and the list.sort() method can be used to sort a
list containing any objects - it's just a case of telling them how to
obtain the key values to compare (which, in the case of simple attribute
access which the namedtuple objects allow, "operator.attrgetter()" will
do that). This is why sorting the list works for you.
You could sort objects of different types - but you might need to supply
a function instead of operator.attrgetter() which looks at the type of
each object and returns something that's obtained differently for each
type (but which the sort function can compare).
When you say 'Foo = namedtuple("Foo", "spam ham")', you are creating a
"factory" which is able to generate "Foo" objects for you.
When you say "x = Foo(1, 2)" you are using the factory to create an
object for you which has its "spam" and "ham" attributes set to the
values 1 and 2 respectively.
When you say "records = [Foo(x, y) for x, y in some_iterable()]", you
are creating a list of such objects. This is the thing you are then sorting.
Does that make sense?
Regards, E.
More information about the Python-list
mailing list