是否有可能search特定的键/值条目,然后,如果find,删除整个字典?
我有一个CSV文件,我将其作为词典列表进行迭代(设想一个由单个字典表示的Excel文件中的每一行,由一个列名和该列的值组成)。
有什么方法可以遍历所有的字典,search特定的键:值组合,如果find,删除整个字典? 本质上,如果特定列== 99999,然后删除行(字典)。
这是我所拥有的,我正在得到这种types的东西似乎很常见的“列表索引超出范围”的错误。
for i in range(len(csv_data)): column_name = 'specific_column' if csv_data[i][column_name] == '99999': del csv_data[i] else: pass
你可以使用列表理解重build列表,而不是保留行:
column_name = 'specific_column' csv_data = [row for row in csv_data if row[column_name] != '99999']
这将创build一个新的列表,replace旧的,其中只有特定列未设置为'99999'
字典被保留。
你正在得到一个IndexError
exception,因为你的循环没有考虑到列表越来越短; 您正在从0循环到N
,但是在删除时,列表的最后一个索引从N - 1
移动到N - 2
等。
此外,当你通过索引循环时,你最终跳过行,因为i
增量,但是当你删除它前面的项目时,列表中的下一个元素向下移动索引。
问题是,一旦你删除一个项目, csv_data
的长度改变, for
循环会迭代错误的次数。 如果直接在csv_data
进行迭代,将会发生另一个问题。 在这种情况下,你不会得到一个exception,但循环会跳过一些值(实际上你当前的循环也是如此,但是你不会注意到由于exception)
而不是立即删除对象,您可以保存索引删除并稍后删除它们:
to_be_removed = [] for i in range(len(csv_data)): column_name = 'specific_column' if csv_data[i][column_name] == '99999': to_be_removed.append(i) for i in to_be_removed: del csv_data[i]
或者,您可以迭代一个副本并从原始值中删除元素:
for i, val in enumerate(list(csv_data)): if val[column_name] = '99999': del csv_data[i]
或者你可以构build一个副本,并避免复制与谓词不匹配的元素:
copy = [] for val in csv_data: if val[column_name] = '99999': copy.append(val)