Python 从目录列表中按索引删除指定的行

Python 从目录列表中按索引删除指定的行,python,dictionary,for-loop,Python,Dictionary,For Loop,我有一个很长的dict列表作为我的数据集(列表中的每一行都是一本字典) 此列表中有几行需要删除(因为这些行中的数据与数据集的其余部分不一致) 我已经创建了一个函数,用于标识我要删除的行的索引号,如下所示: indices_to_remove = [10200, 15006, 22833, 33442, 54214] 我希望有一个函数可以删除/删除列表中的所有行,如果它们的索引与此列表匹配 以下是我迄今为止所做的尝试: my_original_dataset = *a list of dicts

我有一个很长的dict列表作为我的数据集(列表中的每一行都是一本字典)

此列表中有几行需要删除(因为这些行中的数据与数据集的其余部分不一致)

我已经创建了一个函数,用于标识我要删除的行的索引号,如下所示:

indices_to_remove = [10200, 15006, 22833, 33442, 54214]
我希望有一个函数可以删除/删除列表中的所有行,如果它们的索引与此列表匹配

以下是我迄今为止所做的尝试:

my_original_dataset = *a list of dicts*

indices_to_remove = [10200, 15006, 22833, 33442, 54214]

def remove_missing_rows(dataset):
    new_list = []
    for row_dict in dataset:
        if row_dict not in indices_to_remove:
            new_list.append(row_dict)
    return new_list

new_dataset_all_empty_removed = remove_missing_rows(my_original_dataset)

我意识到问题在于,row_dict指的是实际的行,而不是该行的索引号,但不知道如何在此处引用行号。

您可以使用
枚举
在行旁边生成索引。另一个加快每个索引查找时间的方法是将索引列表设置为一个集合;集合针对成员资格检查进行了优化:

indices_to_remove = {10200, 15006, 22833, 33442, 54214}

def remove_missing_rows(dataset):
    new_list = []
    for i, row_dict in enumerate(dataset):
        if i not in indices_to_remove:
            new_list.append(row_dict)
    return new_list
您也可以使用列表理解直接执行此操作,而无需创建函数:

new_list = [x for i, x in enumerate(dataset) if i not in indices_to_remove]

这将创建一个新列表,其中要删除的
索引中的所有项目都将被删除。

您可以使用
枚举
在行旁边生成索引。另一个加快每个索引查找时间的方法是将索引列表设置为一个集合;集合针对成员资格检查进行了优化:

indices_to_remove = {10200, 15006, 22833, 33442, 54214}

def remove_missing_rows(dataset):
    new_list = []
    for i, row_dict in enumerate(dataset):
        if i not in indices_to_remove:
            new_list.append(row_dict)
    return new_list
您也可以使用列表理解直接执行此操作,而无需创建函数:

new_list = [x for i, x in enumerate(dataset) if i not in indices_to_remove]

这将创建一个新的列表,其中要删除的
索引中的所有项目都已删除。

要从数据集中删除,请使用
dataset.pop(i)

您必须从末尾到开头
pop
,因此需要对要删除的
索引进行排序,或者您必须明确地进行排序

dataset = [1,2,3,4,5]
indices_to_remove = [1,3]

[dataset.pop(i) for i in indices_to_remove[::-1]]

dataset

Out[195]: [1, 3, 5]
listcomp的输出可以忽略-您只需要从列表中删除行的“副作用”

正如建议的那样:

for i in indices_to_remove[::-1]:
    dataset.pop(i)

可以是“更干净的”

从数据集中删除,
dataset.pop(i)
有效

您必须从末尾到开头
pop
,因此需要对要删除的
索引进行排序,或者您必须明确地进行排序

dataset = [1,2,3,4,5]
indices_to_remove = [1,3]

[dataset.pop(i) for i in indices_to_remove[::-1]]

dataset

Out[195]: [1, 3, 5]
listcomp的输出可以忽略-您只需要从列表中删除行的“副作用”

正如建议的那样:

for i in indices_to_remove[::-1]:
    dataset.pop(i)
可能是“更干净”

我想不是这个 代码第8行中的“if row_dict not in index_to_remove:” 这将完成删除 “如果dataset.index(row_dict)不在要删除的索引中:”

我认为应该这样做 代码第8行中的“if row_dict not in index_to_remove:” 这将完成删除

“如果dataset.index(row_dict)不在index_to_remove:”

您说要删除元素,但在代码中创建了一个新列表。你到底想做什么?为什么不在计算索引时这样做?如果我列表中的一行的索引号与我的索引列表中的整数匹配,我想删除该行。@dcg你说:“为什么不在计算索引时这样做?”我不知道怎么做。下面是用于标识缺少\u id\u vals=[i代表i,如果不是a.get(“id”,False),则在枚举(my_original\u dataset)中为a]的行的代码。您说要删除元素,但在代码中创建了一个新列表。你到底想做什么?为什么不在计算索引时这样做?如果我列表中的一行的索引号与我的索引列表中的整数匹配,我想删除该行。@dcg你说:“为什么不在计算索引时这样做?”我不知道怎么做。下面是用于识别缺少\u id\u vals=[i代表i,如果不是a.get(“id”,False),则在enumerate(我的\u原始\u数据集)中为a]的行的代码,或者使用列表理解:
[d代表i,如果我不在enumerate(数据集)中为d,则在enumerate(数据集)中为d]
。但是,这两种方法都不会删除索引,而是会创建一个新列表。这很有效,谢谢!关于如何使用枚举有什么建议吗?我还没有真正了解他枚举函数的工作原理。输入错误:
如果我不在:
;)@ThomasErnste检查文档:或使用列表理解:
[d代表枚举(数据集)中的i,d如果我不在要删除的位置]
。但是,这两种方法都不会删除索引,而是会创建一个新列表。这很有效,谢谢!关于如何使用枚举有什么建议吗?我还没有真正了解他枚举函数的工作原理。输入错误:
如果我不在:
;)@ThomasErnste检查文档:注意,在最坏的情况下,这是二次的。使用列表理解的副作用有一些代码味道,这不一定是“此列表中有几行需要删除”的问题。最好使用普通循环。请注意,在最坏的情况下,这是二次循环。使用列表理解的副作用可能会有一些代码味道,这不一定是“此列表中有几行需要删除”的问题。最好使用正常循环。