从namedtuple属性创建新列表
问题描述:
我试图将名称为< 2000的书名复制到新列表中。但我遇到的问题是,它仅复制“1984”,并将其复制它作为一个个性到列表中,而不是复制所有它的应该从namedtuple属性创建新列表
from collections import namedtuple
Book = namedtuple('Book','author title genre year price instock')
BSI = [ Book('John Green', 'Paper Towns', 'Young Adult', 2008, 7.00, 200),
Book('Beverly Clearly', 'Ramona Forever', 'Children', 1924, 9.00, 150),
Book('Vladmir Nabokov', 'Lolita', 'Tragicomedy', 1958, 15.00 , 80),
Book('J.D. Salinger', 'Catcher in the Rye', 'Young Adult', 1951, 10.00, 130),
Book('George Orwell', '1984', 'Dystopia', 1949, 7.00, 300),
Book('Jeannette Walls','The Glass Castle','Memoir', 2006, 15.00 , 100)]
older_books = []
for books in BSI:
if (books.year<2000):
older_books=list(books.title)
print(older_books) #Outputs ['1', '9', '8', '4']
它应该输出
名称拉马纳永远
洛丽塔
麦田捕手
答
随着每个for
循环,代码将覆盖上一个书名(转换为列表)的列表older_books
,因为您没有追加到该列表,而只是每次创建一个新列表。
>>> list('Ramona Forever')
['R', 'a', 'm', 'o', 'n', 'a', ' ', 'F', 'o', 'r', 'e', 'v', 'e', 'r']
>>> list('1984')
['1', '9', '8', '4']
使用list.append
,使符合条件的所有书名将追加到一个列表:使用list comprehension替代
>>> older_books = []
>>> older_books.append('Ramona Forever')
>>> older_books.append('1984')
>>> older_books
['Ramona Forever', '1984']
for books in BSI:
if books.year < 2000:
older_books.append(books.title) # <---
UPDATE:
older_books = [b.title for b in BSI if b.year < 2000]
另外,这个问题可以通过列表理解得到很好的处理:'old_books = [b.title for b in BSI if b.year mtrw
@mtrw,感谢您的评论。我相应地添加了另一种解决方案。 – falsetru