2016-02-05 169 views
3

我有一個功能,我寫了從2D列表(從CSV上傳)刪除列:KeyError:0; Python從列表中刪除列

#method to remove a column from a list if it does not contain an int 
def remove_nonint(list): 
    for row in list: 
     for i in range(0, len(row)): 
      if isinstance(row[i], (int, long)) != True: 
       del row[i] 

然而,當我在名單上運行此,我得到以下錯誤:

<ipython-input-23-10a39a11efb3> in remove_nonint(list) 
     3  for row in list: 
     4   for i in range(0, len(row)): 
----> 5    if isinstance(row[i], (int, long)) != True: 
     6     del row[i] 

KeyError: 0 

列表[0]是這樣的:

{u'2B': 0, 
u'3B': 0, 
u'AB': 4, 
u'BB': 0, 
u'CS': 0, 
u'G': 1, 
u'GIDP': None, 
u'H': 0, 
u'HBP': None, 
u'HR': 0, 
u'IBB': None, 
u'R': 0, 
u'RBI': 0, 
u'SB': 0, 
u'SF': None, 
u'SH': None, 
u'SO': 0, 
u'lgID': u'NA', 
u'playerID': u'abercda01', 
u'stint': u'1', 
u'teamID': u'TRO', 
u'yearID': u'1871'} 

編輯:這是我上傳的CSV:

import unicodecsv 

with open('lahman-csv_2015-01-24/batting.csv', 'rb') as f: 
    reader = unicodecsv.DictReader(f) 
    batting = list(reader) 

batting[0] 
+1

它是一個二維列表或類型的字典列表? –

+2

也許你想要改變'對於我在範圍內(0,len(row)):'to'鍵入行:'? – user2829759

+0

我用DictReader,所以我想它是一個字典列表 – user1072337

回答

5

row是一個字典,不是一個列表,因此它不一定在索引0處有任何東西。在這種情況下,正如你所看到的,它不是。

的常用方法來遍歷一個字典是,如果你期望被檢查存儲在key值要麼

for key in some_dict:for key, val in some_dict.items(): 後一種形式是有用的,你想給它一個名稱,而而不是指some_dict [val],這可能很麻煩。

在這種情況下

,我會做這樣的事情:

for row in list: 
    for key, val in row.items(): 
     if not isinstance(val, (int, long)): 
      del row[key] 
+0

是的,我得到這個錯誤:ValueError :太多的值來解壓 – user1072337

+0

與python2,使用'iteritems()'而不是'items()' –

+0

是的,你可以用戶iteritems如果你喜歡。 –

1

既然你有類型的字典列表,你可以使用下面的。

def remove_nonint(lst): 
    for row in lst: 
     for k, v in dict(row).iteritems(): 
      if not isinstance(v, (int, long)): 
       del row[k] 

這使得每個dict的副本,以避免changed size during iteration錯誤。

另一種方法是返回一個新的列表,只有整數項,

def filter_nonint(lst): 
    l = [] 
    d = {} 
    for row in lst: 
     for k, v in row.iteritems(): 
      if isinstance(v, (int, long)): 
       d[k] = v 
     l.append(d) 
    return l 

或作爲一個班輪

def filter_nonint2(lst): 
    return [{k: v for k, v in row.iteritems() if isinstance(v, (int, long))} for row in lst] 
+0

這只是返回非int列 – user1072337

+0

對面我想要的 – user1072337

+0

好吧應該是好的。另外,如果isinstance(row [i],(int,long))!= True:'代碼很混亂。對我的眼睛使用「不」或「== False」更容易理解。 –