Python 按索引列表删除dict元素
我有一个相同长度的不同键的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
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很好。这是通过枚举
修复的。谢谢:-)