【发布时间】:2016-09-20 08:04:05
【问题描述】:
我认为这将是一个超级简单的排序练习,但我不明白我遇到的错误。
我正在创建一个简单的Book 类,然后添加两个条目。然后我通过sorted 进行排序并使用lambda,以便我按isbn 属性进行排序。
books = []
class Book:
def __init__(self, title, author, isbn):
self.title, self.author, self.isbn = title, author, isbn
def __repr__(self):
return repr((self.title, self.author, self.isbn))
#add 2 items
b = Book('Russian for All', 'Chompsky', '334')
books.append(b)
c = Book('English for All', 'Zöd', '229')
books.append(c)
#sort items by the isbn number
sorted_books = sorted(books, key=lambda book: book[2])
a) 我相信__repr__ 是必需的,以便在将每个条目添加到数组时为每个条目获得一个漂亮的元组,例如:
print(books)
[('Russian for All', 'Chompsky', '334'), ('English for All', 'Zöd', '229')]
b) 因为这看起来像一个标准的元组列表,所以使用 sorted 函数应该没有问题,但是我得到了这个错误:
Traceback (most recent call last):
File "Untitled 2.py", line 19, in <module>
sorted_books = sorted(books, key=lambda book: book[2])
File "Untitled 2.py", line 19, in <lambda>
sorted_books = sorted(books, key=lambda book: book[2])
TypeError: 'Book' object does not support indexing
就好像我看到了一个很好的元组来表示对象,但它们实际上被屏蔽为排序函数无法访问的对象。
【问题讨论】:
-
“因为这看起来像一个标准的元组列表,所以使用 sorted 函数应该没有问题” - 不,你只是改变了你的对象的样子。你没有改变他们的任何其他东西。
-
“因为这个氰化物丸看起来像药,我应该可以用它来治疗我的病。” “因为这张假钞看起来像合法的钱,我应该可以毫无问题地用它购买东西。” “因为这个诈骗网站看起来像我银行的网站,所以输入我的用户名和密码应该是安全的。”改变事物的外观并不会自动改变它的本质或行为方式。