KeyError:0; Python从列表中删除列

时间:2016-02-05 03:54:12

标签: python

我编写了一个函数来删除2D列表中的列(从CSV上传):

#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

list [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]

2 个答案:

答案 0 :(得分:5)

row是一个字典,而不是列表,所以它不一定在索引0处有任何东西。在这种情况下,如你所见,它没有。

迭代dict的常用方法是

for key in some_dict: 要么 for key, val in some_dict.items(): 如果您希望检查存储在key的值,并且您想要给它命名而不是引用some_dict [val],后一种形式很有用,这可能很麻烦。

在这种情况下,我会做这样的事情:

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

答案 1 :(得分:1)

鉴于您有一个dicts列表,您可以使用以下内容。

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]