2012-12-19 114 views
0

我只是測試列表如何在python中工作,我發現它很混亂和令人沮喪。無論出於什麼原因,我的代碼都會收到不斷的錯誤消息。追加到列表中刪除列表中的元素

def listtest(list1,x): 
    list2 = [] 
    count = 0 
    for n in list1: 
     if list1[count] == x: 
      count += 1 
     else: 
      list2 = list.append(list2,list[count]) 
      count += 1 
    return list2 

無論出於何種原因,它要麼告訴我list.append只接受一個令人困惑的參數。在交互窗口中,我可以使用兩個參數來調用append,例如list.append(list,3)或其他任何參數,並且它可以完美地工作。我得到的另一個錯誤是

list2 = list.append(list2,list[count]) 
TypeError: 'type' object has no attribute '__getitem__' 

這對我來說完全沒有意義,也沒有任何幫助。我的代碼有什麼問題?爲什麼交互窗口的行爲與其他窗口不同?爲什麼不會像在交互窗口中那樣追加工作?

回答

4

編輯:後,一些更仔細的分析改寫:

立即解決問題是list[count]應該list1[count]。內置類型list不能被索引(因爲它是一種類型,而不是一個列表),所以你得到TypeError__getitem__()方法不被支持。

但即使你已經寫了list2 = list.append(list2,list1[count]),你仍然有問題。那行代碼會做什麼?

  1. 附加list1[count]list2。到現在爲止還挺好。
  2. 將呼叫結果分配給list.append()list2。由於.append()是一種修改其就地調用的對象的方法,因此它總是返回None
  3. 所以現在list2None
  4. 下一個當你打電話給該行,你會得到另一TypeError,因爲你不能追加任何東西NoneType對象。

所以,你應該寫什麼

list2.append(list1[count]) 

雖然現在將工作,這是一個非常迂迴的方式來做到這一點。跟蹤你實際上並不需要的索引是非常寬鬆的 - 語言比這更富有表現力。不要試圖用Python編寫Java程序。你的函數(如果你的目的真的是爲了創建一個包含所有在list1是一樣x對象一個新的列表 - 對此我看不到完全的點)可以寫成

def listtest(list1, x): 
    return [item for item in list1 if item == x] 

雖然這並不比簡單地寫

list1.count(x) 

,讓你x出現在list1的次數更加有用。

+0

看來我一次可以追加多個項目。例如,我現在在交互窗口list.appen([1,2,3,4],5) –

+1

@Jordan中執行此操作:您可以通過兩種方式調用許多方法。您可以調用類的方法 - list.append - 並將它作爲第一個參數傳遞給它,如'a = [1,2,3]; b = 4; list.append(a,b)',它會把'a'變成'[1,2,3,4]',或者你可以直接調用實例方法,比如'a = [1,2,3]; b = 4; a.append(4)'。第二個與第一個相同,除了'a'被自動包含在內。你應該很少需要直接使用'list.append'。 – DSM

+0

@Jordan:感謝您的評論,我現在看到了實際問題。我編輯了我的答案。 –

-1

您一次只能追加一個項目列表。您可以使用第二個列表的項目擴展()一個列表,這意味着您將第二個列表中的每個單獨項目追加到第一個列表的第一個列表中。這裏有什麼難以理解的?列表API有很好的記錄和清晰。

+0

很難理解爲什麼它告訴我list.append只在我給它的時候接受一個參數。 –

+0

另外我不知道什麼API甚至是。 –

1

你的錯誤並不是荒謬的,他們試圖指出你的根本問題。您不應該使用list作爲變量名稱,因爲list是內置類型。此外,當您嘗試將append添加到列表中時,您只需要傳遞一個參數。您可以append一個tuple像這樣:

myList.append(('val1', 'val2')) 
+0

我不確定什麼是元組,但是當我追加它時,它被包裹在圓括號中。 –

+0

@Jordan一個元組是一個不變的列表,像Python中的數據類型:[Tuple Docs](http://docs.python.org/2/library/functions.html#tuple) – sean

2

如果要追加到list2,使用list2.append(),不list.append()

+0

哦,這是有幫助的,我沒有看到文檔中的任何地方,變量是什麼去那裏我認爲這只是一個命名函數。 –

+0

'append'是內置列表類的一種方法。 –

+0

雖然「list2 = list2.append(list1 [count]) AttributeError:'NoneType'對象沒有屬性'append'' –