Python 按索引列表删除dict元素

Python 按索引列表删除dict元素,python,list,dictionary,indexing,list-comprehension,Python,List,Dictionary,Indexing,List Comprehension,我有一个相同长度的不同键的dict: list_in_dict = list(range(0, 10)) test_dict = {"A" : list_in_dict , "B": list_in_dict , "C": list_in_dict} 然后我有一个索引如下的列表: delete_index_list = [1,5,7] 我想删除键中的所有元素,其中位置对应于索引 我尝试过这个(但完全失败): 可能我必须在这里使用列表理解?实现这一结果最简单的方法是什么: test_dict

我有一个相同长度的不同键的dict:

list_in_dict = list(range(0, 10))
test_dict = {"A" : list_in_dict , "B": list_in_dict , "C": list_in_dict}
然后我有一个索引如下的列表:

delete_index_list = [1,5,7]
我想删除键中的所有元素,其中位置对应于索引

我尝试过这个(但完全失败):

可能我必须在这里使用列表理解?实现这一结果最简单的方法是什么:

test_dict 
Out: 
{'A': [0, 2, 3, 4, 6, 8, 9],
 'B': [0, 2, 3, 4, 6, 8, 9],
 'C': [0, 2, 3, 4, 6, 8, 9]}

您可以尝试听写和列表理解:

{k:[elt for ind, elt in enumerate(v) if ind not in delete_index_list] for k,v in test_dict.items() }
完整代码:

# Build data
list_in_dict = list(range(0, 10))
test_dict = {"A" : list_in_dict , "B": list_in_dict , "C": list_in_dict}

# Index to remve
delete_index_list = [1,5,7]

out = {k:[elt for ind, elt in enumerate(v) if ind not in delete_index_list] for k,v in test_dict.items() }
print(out)
# {'A': [0, 2, 3, 4, 6, 8, 9],
#  'B': [0, 2, 3, 4, 6, 8, 9],
#  'C': [0, 2, 3, 4, 6, 8, 9]}

您可以尝试听写和列表理解:

{k:[elt for ind, elt in enumerate(v) if ind not in delete_index_list] for k,v in test_dict.items() }
完整代码:

# Build data
list_in_dict = list(range(0, 10))
test_dict = {"A" : list_in_dict , "B": list_in_dict , "C": list_in_dict}

# Index to remve
delete_index_list = [1,5,7]

out = {k:[elt for ind, elt in enumerate(v) if ind not in delete_index_list] for k,v in test_dict.items() }
print(out)
# {'A': [0, 2, 3, 4, 6, 8, 9],
#  'B': [0, 2, 3, 4, 6, 8, 9],
#  'C': [0, 2, 3, 4, 6, 8, 9]}

您的方法的主要问题是,一旦删除索引
1
,以前在索引
5
上的内容现在实际上在
4
。如果对
delete\u items\u list
中的项目进行了排序,您可以从列表的末尾开始,然后返回到开始。(也没有必要弄乱
delete\u items\u list
的索引……这并没有引起问题,但我在这里修复了它,以帮助提高代码的可读性。)

通过添加另一个for循环,可以减少重复性:

for k in test_dict:
    for i in reversed(delete_index_list):
        del(test_dict[k][i])
正如另一个答案中所建议的,如果重建
test\u dict
中的列表是可以的,那么可以通过理解来完成。为了正确地删除索引而不是值,您需要使用
enumerate()


您的方法的主要问题是,一旦删除索引
1
,以前在索引
5
上的内容现在实际上在
4
。如果对
delete\u items\u list
中的项目进行了排序,您可以从列表的末尾开始,然后返回到开始。(也没有必要弄乱
delete\u items\u list
的索引……这并没有引起问题,但我在这里修复了它,以帮助提高代码的可读性。)

通过添加另一个for循环,可以减少重复性:

for k in test_dict:
    for i in reversed(delete_index_list):
        del(test_dict[k][i])
正如另一个答案中所建议的,如果重建
test\u dict
中的列表是可以的,那么可以通过理解来完成。为了正确地删除索引而不是值,您需要使用
enumerate()


dict不能保证钥匙的顺序。如果您建立了严格的关系-手动删除或使用键和指示器之间的映射创建
test\u dict
,则只需从键
a
中删除项,因为其他值引用的是相同的
列表。\u dict
dict不会保证键的顺序。如果您建立了严格的关系-手动删除或使用键和指示灯之间的映射创建
test\u dict
,则只需从键
a
中删除项目,因为其他值都引用了相同的
list\u,如果将列表更改为
范围(1,10)
,请检查结果。删除的是值1、5和7,而不是索引。你的测试列表中的值和索引是相同的,这掩盖了这一事实。你比我快,我用同样的方法解决它+我和你删除了我的答案:)@glibdud很好。这是通过
枚举
修复的。谢谢:-)如果将列表更改为
范围(1,10)
,请检查结果。删除的是值1、5和7,而不是索引。你的测试列表中的值和索引是相同的,这掩盖了这一事实。你比我快,我用同样的方法解决它+我和你删除了我的答案:)@glibdud很好。这是通过
枚举
修复的。谢谢:-)