Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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 - Fatal编程技术网

在Python中,如何使用另一个字典作为关键字过滤字典?

在Python中,如何使用另一个字典作为关键字过滤字典?,python,Python,我已经创建了一个字典,可以在以后将其上传到excel文件中,但它没有经过过滤。主词典如下所示: final_dict = {} for key, value in main_dict.items(): for check_key, check_value in checker_dict.items(): if checker_key in key corresponds with checker_value in value: # I know there

我已经创建了一个字典,可以在以后将其上传到excel文件中,但它没有经过过滤。主词典如下所示:

final_dict = {}
for key, value in main_dict.items():
    for check_key, check_value in checker_dict.items():
        if checker_key in key corresponds with checker_value in value:
        # I know there is no such syntax, but still, I want them to be
        # checked every time for having both elements in original key 
        # and value
            final_dict[key] = value
我通过匹配产品x、产品n等的键和值来填充字典

main_dict = {
"product_x_name_1L": "product_x_pic_1l",
"product_y_name_4L": "product_y_pic_4l",
"product_z_name_20L": "product_z_pic_20l",
"product_n_name_1L": "product_n_pic_4l",
"product_q_name_200L": "product_q_pic_20l",
"product_s_name_4L": "product_s_pic_200l"
}
事实是,产品名称只能有一个1l卷的图片,产品q只能有一个200l卷的图片,等等(因为这些是我仅有的图片)。发生这种错误的原因是,在生成字典时,键会根据名称匹配与任何合适的值相匹配,即使volume参数实际上是错误的

所以我想出了另一个字典,它可以作为对字典进行排序并跳过错误值的键: (键中的Ls为大写字母)

然而,我真的不知道如何在没有大量嵌套for循环的情况下创建合并代码,这些循环最终会一遍又一遍地重写值

我需要实现如下内容:

final_dict = {}
for key, value in main_dict.items():
    for check_key, check_value in checker_dict.items():
        if checker_key in key corresponds with checker_value in value:
        # I know there is no such syntax, but still, I want them to be
        # checked every time for having both elements in original key 
        # and value
            final_dict[key] = value

这似乎比你想象的要容易:

main_dict = {
"product_x_name_1L": "product_x_pic_1l",
"product_y_name_4L": "product_y_pic_4l",
"product_z_name_20L": "product_z_pic_20l",
"product_n_name_1L": "product_n_pic_4l",
"product_q_name_200L": "product_q_pic_20l",
"product_s_name_4L": "product_s_pic_200l",
}
checker_dict = {
"1L": "1l",
"4L": "4l",
"20L": "20l",
"200L": "200l"
}
final_dict = {}
for key, value in main_dict.items():
        if checker_dict[key.split('_')[-1]] == value.split('_')[-1]:
            final_dict[key]=value

实际上,不需要使用checker dict。因为您的数据格式良好(卷位于字符串末尾。您只需访问键的卷和字符串的小写值,并检查它们是否匹配。如果匹配,则将其添加到您的
最终dict
。执行相同操作的不同之处如下:

For循环:

final_dict = {}
for key, value in main_dict.items():
    if value.split('_')[-1].lower() == key.split('_')[-1].lower():
        final_dict[key] = value
final = {k: v for k, v in main_dict.items() if v.split('_')[-1].lower() == k.split('_')[-1].lower()}
dict(filter(lambda kv: extract_lower(kv[0]) == extract_lower(kv[1]), main_dict.items()))
{'product_x_name_1L': 'product_x_pic_1l',
 'product_y_name_4L': 'product_y_pic_4l',
 'product_z_name_20L': 'product_z_pic_20l'}
列表理解:

final_dict = {}
for key, value in main_dict.items():
    if value.split('_')[-1].lower() == key.split('_')[-1].lower():
        final_dict[key] = value
final = {k: v for k, v in main_dict.items() if v.split('_')[-1].lower() == k.split('_')[-1].lower()}
dict(filter(lambda kv: extract_lower(kv[0]) == extract_lower(kv[1]), main_dict.items()))
{'product_x_name_1L': 'product_x_pic_1l',
 'product_y_name_4L': 'product_y_pic_4l',
 'product_z_name_20L': 'product_z_pic_20l'}
过滤器:

final_dict = {}
for key, value in main_dict.items():
    if value.split('_')[-1].lower() == key.split('_')[-1].lower():
        final_dict[key] = value
final = {k: v for k, v in main_dict.items() if v.split('_')[-1].lower() == k.split('_')[-1].lower()}
dict(filter(lambda kv: extract_lower(kv[0]) == extract_lower(kv[1]), main_dict.items()))
{'product_x_name_1L': 'product_x_pic_1l',
 'product_y_name_4L': 'product_y_pic_4l',
 'product_z_name_20L': 'product_z_pic_20l'}
输出:

final_dict = {}
for key, value in main_dict.items():
    if value.split('_')[-1].lower() == key.split('_')[-1].lower():
        final_dict[key] = value
final = {k: v for k, v in main_dict.items() if v.split('_')[-1].lower() == k.split('_')[-1].lower()}
dict(filter(lambda kv: extract_lower(kv[0]) == extract_lower(kv[1]), main_dict.items()))
{'product_x_name_1L': 'product_x_pic_1l',
 'product_y_name_4L': 'product_y_pic_4l',
 'product_z_name_20L': 'product_z_pic_20l'}

我想这可能是我尝试使用
map
的少数情况之一,因为应用于key和value的函数是相同的。你是对的!我编辑了我的答案,给出了更多的方法。谢谢你的评论。