我编写了一个函数来删除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]
答案 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]