2016-12-20 3 views
0

В Python существует функция, которая классифицирует и упорядочивает массив объектов по атрибуту?Имея массив объектов в python, как я могу классифицировать его элементы по атрибуту?

Пример:

class Book: 
    """A Book class""" 
    def __init__(self,name,author,year): 
     self.name = name 
     self.author = author 
     self.year = year 

hp1 = Book("Harry Potter and the Philosopher's stone","J.k Rowling",1997) 
hp2 = Book("Harry Potter and the chamber of secretse","J.k Rowling",1998) 
hp3 = Book("Harry Potter and the Prisioner of Azkaban","J.k Rowling",1999) 

#asoiaf stands for A Song of Ice and Fire 
asoiaf1 = Book("A Game of Thrones","George R.R Martin",1996) 
asoiaf2 = Book("A Clash of Kings","George R.R Martin",1998) 

hg1 = Book("The Hunger Games","Suzanne Collins",2008) 
hg2 = Book("Catching Fire","Suzanne Collins",2009) 
hg3 = Book("Mockingjaye","Suzanne Collins",2010); 

books = [hp3,asoiaf1,hp1,hg1,hg2,hp2,asoiaf2,hg3] 
#disordered on purpose 

organized_by_autor = magic_organize_function(books,"author") 

Существует ли magic_organize_function? В противном случае, что бы это было?

+0

Итак, вы хотите группировать и сортировать по автору? – birryree

+3

Функция 'sorted()' в Python принимает параметр 'key'. Он используется для указания _how_, который вы хотите отсортировать список. В вашем случае вы хотите отсортировать атрибут 'author' каждого элемента в списке' books': 'organiz_by_autor = отсортировано (книги, лямбда-книга: book.author)' –

+0

FWIW '' 'излишни. Они ничего не делают. –

ответ

1

Сортировка по автору является одним из способов:

sorted_by_author = sorted(books, key=lambda x: x.author) 
for book in sorted_by_author: 
    print(book.author) 

Выход:

George R.R Martin 
George R.R Martin 
J.k Rowling 
J.k Rowling 
J.k Rowling 
Suzanne Collins 
Suzanne Collins 
Suzanne Collins 

Вы можете также хорошо группировать по автору, используя itertools.groupby:

from itertools import groupby 

organized_by_author = groupby(sorted_by_author, key=lambda x: x.author) 

for author, book_from_author in organized_by_author: 
    print(author) 
    for book in book_from_author: 
     print(' ', book.name) 

Выход:

George R.R Martin 
    A Game of Thrones 
    A Clash of Kings 
J.k Rowling 
    Harry Potter and the Prisioner of Azkaban 
    Harry Potter and the Philosopher's stone 
    Harry Potter and the chamber of secretse 
Suzanne Collins 
    The Hunger Games 
    Catching Fire 
    Mockingjaye 

Примечание: Вам необходимо подать groupby отсортировано по номеру sorted_by_author.

+0

Это именно то, что я искал. Спасибо огромное! –