我有一个字典my_dict
和一个令牌my_tok
列表,如下所示:
my_dict = {'tutor': 3,
'useful': 1,
'weather': 1,
'workshop': 3,
'thankful': 1,
'puppy': 1}
my_tok = ['workshop',
'puppy']
是否可以保留在my_dict
中,只保留my_tok
中存在的值而不是弹出其余值?
即,我只需保留workshop
和puppy
。
提前致谢!
答案 0 :(得分:2)
只是像这样覆盖它:
my_dict = {k:v for k, v in my_dict.items() if k in my_tok}
这是dictionary comprehension,只使用my_dict
列表中作为条目的密钥重新创建my_tok
。
如评论中所述,如果my_tok
列表中的元素数量与字典键相比较小,则此解决方案不是最有效的解决方案。在这种情况下,迭代my_tok
列表会更好,如下所示:
my_dict = {k:my_dict.get(k, default=None) for k in my_tok}
这或多或少是其他答案提出的。唯一的区别是使用.get
字典方法允许我们不关心密钥是否存在于字典中。如果不是,则会为其分配默认值。
答案 1 :(得分:2)
查看my_tok
中的值,并获取原始词典中的结果。
my_dict = {i:my_dict[i] for i in my_tok}
答案 2 :(得分:2)
您只需覆盖原始字典:
new_dic = {token:my_dict[key] for key in my_tok if key in my_dict}
请注意,您构建了一个 new 字典(也许您可以立即将其写入my_dict
),但这会产生影响:对字典的其他引用不会反映此更改。
由于令牌(my_tok
)的数量有限,因此最好迭代这些令牌并对字典进行包含检查(而不是循环原始字典中的元组)。 / p>
如果您希望让更改反映在原始字典中,您可以在第二步中.clear()
原始字典并.update()
相应地:
new_dic = {token:my_dict[key] for key in my_tok if key in my_dict}
my_dict.clear()
my_dict.update(new_dic)