Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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_Python 3.x_Dictionary_Pytorch - Fatal编程技术网

在Python中从列表理解构造键:值对

在Python中从列表理解构造键:值对,python,python-3.x,dictionary,pytorch,Python,Python 3.x,Dictionary,Pytorch,我正在尝试扩展一些代码 工作原理: pretrained_dict = {k: v for k, v pretrained_dict.items if k in model_dict} 但是,如果我将其扩展到: pretrained_dict = {k: v if k in model_dict else k1:v1 for k, v, k1, v1 in zip(pretrained_dict.items(), model_dict.items()) } 代码失败,如果我将else放在末尾

我正在尝试扩展一些代码

工作原理:

pretrained_dict = {k: v for k, v pretrained_dict.items if k in model_dict}
但是,如果我将其扩展到:

pretrained_dict = {k: v if k in model_dict else k1:v1 for k, v, k1, v1 in zip(pretrained_dict.items(), model_dict.items()) }
代码失败,如果我将else放在末尾,它仍然失败:

 pretrained_dict = {k: v if k in model_dict for k, v, k1, v1 in zip(pretrained_dict.items(), model_dict.items()) else k1:v1}
                                                 ^
SyntaxError: invalid syntax
如何在两个列表上使用if-else条件构造键值对?

您可以使用a来实现您想要的,而不必使用理解

from collections import ChainMap
pretrained_dict = ChainMap(pretrained_dict, model_dict)

这将返回一个类似字典的对象,该对象将首先查找
预训练dict
中的键,如果它不存在,则在
模型dict
中查找键第二个理解不起作用的原因是三元运算符仅应用于值。幸运的是,这两种情况都适用于同一个键,因此实际上可以稍微简化语法。如果情况并非如此,则必须使用两个单独的三元运算符或
for
循环

另一个问题是在循环变量中没有显示分组
dict.items
生成元组,您必须明确如何解包它们

因此:

但是,这实际上不会执行任何您想要的查找。如果您的目标是批量接受从
pretrained_dict
model_dict
的密钥,则需要使用相应的密钥使用
model_dict.update
。将两个字典压缩在一起通常是没有意义的,因为它们没有相同的键,因此不清楚结果会是什么。在这里使用理解也不符合字面要求,因为它必然意味着替换而不是更新。在任何一种情况下,您的结果都应该影响
模型dict
,而不是
预训练dict

以下是如何进行更新:

model_dict.update((k, v) for k, v in pretrained_dict.items() if k in model_dict)

看起来您需要一个从
pretrained_dict
返回值的字典,如果该键不存在,则在
model_dict
中查找该键?如果您共享一些示例数据和所需结果,这将很有帮助。第一个代码段的输入错误为,但需要做的是:在预训练的dict中查找model_dict的键,如果找到,则更新键,否则保留model_dict的原始键这将为您提供一个只需that@IainShelvington. 某种程度上。它还将包含
pretrained_dict
中不在
model_dict
中的所有键,OP不需要这些键。@tstseby。这一要求应该是问题的一部分。别忘了在生成的字典中提到允许使用哪些键。
model_dict.update((k, v) for k, v in pretrained_dict.items() if k in model_dict)