是否可以搜索特定的键/值条目,然后,如果找到,则删除整个词典?

2024-05-19 10:23:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个CSV文件,作为字典列表进行迭代(假设excel文件中的每一行都由一个单独的字典表示,该字典由一个列名和该列的值组成)

是否有任何方法可以遍历所有字典,搜索特定的键:值组合,如果找到,则删除整个字典?基本上,如果特定列==99999,则删除该行(字典)

这就是我所拥有的,我得到的“列表索引超出范围”错误似乎是 与这类事物相同

for i in range(len(csv_data)):
    column_name = 'specific_column'
    if csv_data[i][column_name] == '99999':
        del csv_data[i]
    else:
        pass

Tags: 文件csv方法namein列表fordata
2条回答

问题是,一旦删除一个项,csv_data的长度就会改变,for循环将迭代错误的次数。如果直接在csv_data上迭代,则会出现另一个问题。在这种情况下,您不会得到异常,但循环会跳过一些值(实际上,您当前的循环也会,但由于异常,您不会注意到)

您可以保存索引以删除对象,而不是立即删除对象,然后再删除:

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]

或者,您可以构建副本,避免复制与谓词不匹配的元素:

copy = []
for val in csv_data:
    if val[column_name] = '99999':
        copy.append(val)

您可以使用列表理解来重建列表,而不是保留行:

column_name = 'specific_column'
csv_data = [row for row in csv_data if row[column_name] != '99999']

这将创建一个新列表,替换旧列表,其中仅保留特定列设置为'99999'的词典

您得到了一个IndexError异常,因为您的循环没有考虑到列表正在变短;您正在从0循环到N,但当您删除时,列表的最后一个索引将从N - 1移动到N - 2,以此类推

此外,当i在索引中循环时,随着i的增加,您会跳过行,但列表中的下一个元素会在删除前面的项目时向下移动

相关问题 更多 >

    热门问题