从python中不在列表中的对象中删除键?

Remove keys from object not in a list in python?

本问题已经有最佳答案,请猛点这里访问。

我有这些钥匙:

1
keep = ["a","c"]

我的字典:

1
2
3
4
5
6
testdict = {'
'
a':'vala',
'
b':'valb',
'
c':'valc',
'
d':'vald'
}

期望输出:

1
2
3
4
testdict = {
'a':'vala',
'c':'valc'
}

我想删除所有与列表中的键不匹配的键。最快的方法是什么?

我试过:

1
2
3
for key, value in testdict.iteritems():
      if key not in keep:
         del testdict[key]

但由于尺寸在变化,上面给了我错误。


不要删除,只需构建一个新的dict:

1
newdict = {k: testdict[k] for k in keep}

如果keep可以包含testdict中不存在的密钥,请添加适当的条件:

1
newdict = {k: testdict[k] for k in keep if k in testdict}

如果必须修改dict对象,请记住在遍历字典时不能修改它。所以首先遍历,然后删除:

1
2
3
to_delete = set(testdict.keys()).difference(keep)
for d in to_delete:
    del testdict[d]


问题是,在使用迭代器时要改变键。如果你有一个合适的钥匙列表,你就可以避免这个问题。

1
2
3
for key, value in list(testdict.keys()):
      if key not in keep:
         del testdict[key]


1
print({k:testDict[k] for k in keep})

或在Py<2.7

1
print dict((k,testDict[k]) for k in keep)

这些假设保留的每个密钥都保证存在于testDict中。