Jesus Arteaga
Jesus Arteaga

Reputation: 1

How to get a sorted list of namedtuples' attributes

I am totally lost as to why I keep getting errors. I am trying to print the titles of the books listed in alphabetical order using sorted().

I keep getting this error:

sorted(BSI, key=list(Book))
TypeError: 'type' object is not iterable

Then this is the code

from collections import namedtuple

Book = namedtuple('Book', 'author title genre year price instock')
BSI = [Book("J.K. Rowling", "Harry Potter", "Fantasy", "2005", 12.00, "34"),
       Book("Dr. Seuss", "Green Eggs and Ham", "Children's", "2000", 8.00, "12"),
       Book("Margaret Mitchell", "Gone with the Wind", "Fiction", "1980", 9.00, "30"),
       Book("John Green", "The Fault in our Stars", "Fiction", "2010", 13.00, "23"),
       Book("Stephanie Meyer", "Twilight", "Fantasy", "2008", 15.00, "8"),
       Book("Suzanne Collins", "The Hunger Games", "Fantasy", "2005", 17.00, "18")]

for x in BSI:
    print(x.title)

y = BSI
for x in BSI:
    sorted(BSI, key=list(Book))

Upvotes: 0

Views: 4441

Answers (1)

Terry Jan Reedy
Terry Jan Reedy

Reputation: 19174

The problem is with list(Book). Book is a type. The following might be what you want.

from collections import namedtuple

Book = namedtuple('Book', 'author title genre year price instock')

BSI = [
    Book ("J.K. Rowling", "Harry Potter", "Fantasy", "2005", 12.00 ,     "34"),
    Book ("Dr. Seuss", "Green Eggs and Ham", "Children's", "2000", 8.00 , "12"),
    Book ("Margaret Mitchell", "Gone with the Wind", "Fiction", "1980", 9.00, "30"),
    Book ("John Green", "The Fault in our Stars", "Fiction", "2010", 13.00, "23"),
    Book ("Stephanie Meyer", "Twilight", "Fantasy", "2008", 15.00, "8"),
    Book ("Suzanne Collins", "The Hunger Games", "Fantasy", "2005", 17.00, "18"),
    ]

for x in BSI:
    print (x.title)
print()
for x in sorted(BSI, key=lambda x: x.title):
    print(x.title)

You can elaborate the key if you really think you might have duplicate titles.

Upvotes: 1

Related Questions