Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python字典中保留项目?_Python_Dictionary - Fatal编程技术网

如何在python字典中保留项目?

如何在python字典中保留项目?,python,dictionary,Python,Dictionary,我有一本字典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中的值,而不弹出其余值? i、 例如,我只需要保留车间和小狗

我有一本字典
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
中的值,而不弹出其余值? i、 例如,我只需要保留
车间
小狗


提前谢谢

就这样覆盖它:

my_dict = {k:v for k, v in my_dict.items() if k in my_tok}
这是一个仅使用
my_-tok
列表中作为条目出现的键重新创建
my_-dict

正如评论中所说,如果
my_tok
列表中的元素数与字典键相比很小,那么这个解决方案不是最有效的。在这种情况下,最好通过
my_tok
列表进行迭代,如下所示:

my_dict = {k:my_dict.get(k, default=None) for k in my_tok}

这或多或少是其他答案的建议。唯一的区别是使用dictionary方法,它允许我们不关心字典中是否存在密钥。如果不是,它将被指定为默认值。

检查
my_tok
中的值,并获得原始字典中的结果

my_dict = {i:my_dict[i] for i in my_tok}
创建新副本 您只需覆盖原始词典即可:

new_dic = {token:my_dict[key] for key in my_tok if key in my_dict}
但是,请注意,您构建了一个新的词典(也许您会立即将其写入
my_dict
),但这会产生影响:对词典的其他引用不会反映这种变化

由于标记(
my_tok
)的数量有限,因此最好迭代这些标记并对字典进行包含检查(而不是在原始字典中循环元组)

更新原始词典 如果您想让更改反映在原始词典中,您可以在第二步中对原始词典进行
.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)

我想交换迭代器和if语句,因为要保留元素检查的键数量非常有限,通常在字典上检查更快。@WillemVanOnsem非常正确。更新了答案hi@willem,谢谢你的回答,我认为应该是
key
而不是
token
@Sailesh:你是对的,谢谢你指出这一点。