2015-10-17 73 views
4

我試圖將名稱爲< 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'] 

它應該輸出

名稱

拉馬納永遠
洛麗塔
麥田捕手

回答

3

隨着每個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] 
+1

另外,這個問題可以通過列表理解得到很好的處理:'old_books = [b.title for b in BSI if b.year <2000]' – mtrw

+0

@mtrw,感謝您的評論。我相應地添加了另一種解決方案。 – falsetru