我有两个字典,键是字符串,值是整数:
ground = {"url1":1,"url2":2,....}
prediction = {"url1":5,"url2":3,....}
我想做的是删除地面上的键,如果它在预测中不存在。
我写了我脑海中最简单的事情:
for key in ground:
if key not in prediction:
del ground[key]
还尝试了这个:
for key in ground:
if not key in prediction.keys():
del ground[key]
两者都没有用。如何实现目标?
您可以使用字典理解来创建新字典:
ground = {k: ground[k] for k in ground if k in prediction}
或者使用 Python 2 中的 ground.keys()
迭代ground
字典的键,或者在 Python 3 中使用list(ground.keys())
(也适用于 Python 2)。这将返回一个新列表,当从ground
字典中删除键时,该列表不受影响:
for k in list(ground.keys()):
if k not in prediction:
del ground[k]
你的第二次尝试在Python 2中工作正常。在Python 3中,keys()
是一个视图而不是一个列表,所以会给出与第一个相同的错误:字典在迭代过程中改变了大小。要解决此问题,请先将其转换为列表:
for key in list(ground.keys()):
if key not in prediction:
del ground[key]
您循环字典并在同一循环中删除密钥。这就是为什么它可能不起作用。尝试:
pred_set = set(prediction.keys())
g_set = set(ground.keys())
for key in g_set - pred_set:
del ground[key]