是否有可能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'字典被保留。

你正在得到一个IndexErrorexception,因为你的循环没有考虑到列表越来越短; 您正在从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)