删除字典键中的子字符串以生成新键

2024-10-01 00:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本这样的字典:

name_score_mapping = {
    'images/distorted/png/31LVTDXBL7AOT2QXJYOJ7PTCYKULRH_00_l.png': 1.2, 
    'images/distorted/png/3NVC2EB65QZGAZCURNCDJZSS1ILY3F_00_l.png': 1.6, 
    'images/distorted/png/3KWTYT08703ZOFSZMRBG4OOG64KL5M_00_l.png': 3.0
}

所需的输出应如下所示:

new_dict = {
    '31LVTDXBL7AOT2QXJYOJ7PTCYKULRH_00_l': 1.2, 
    '3NVC2EB65QZGAZCURNCDJZSS1ILY3F_00_l': 1.6, 
    '3KWTYT08703ZOFSZMRBG4OOG64KL5M_00_l': 3.0
}

以下是我尝试过的:我去掉了路径名images/distorted/png/和结尾.png。我设法用sub()正则表达式方法实现了这一点:

allslice = [
    r'\bimages/distorted/png/\b',
    r'\bimages/original/png/\b',
    r'\b.png\b'
]

get_values = list(name_score_mapping.values())
oldkeys = list(name_score_mapping.keys())
newkeys = [re.sub('|'.join(allslice), '', str(oldkeys)) for s in oldkeys]

输出:

newkeys = ["['31LVTDXBL7AOT2QXJYOJ7PTCYKULRH_00_l', '3NVC2EB65QZGAZCURNCDJZSS1ILY3F_00_l',3KWTYT08703ZOFSZMRBG4OOG64KL5M_00_l']"] 

我删除了外部列表。然后我想使用newkeys作为键和name_score_mapping值生成一个新字典。我尝试过这样的zip()方法:

newkeys = newkeys[0]

new_dict = {k: v for k, v in zip(newkeys, get_values)}

输出:

new_dict = {'[': 1.2, "'": 3.0, '3': 1.6}

我不明白为什么键中的字符串不被识别,而是被分割。此外,这些值也不符合顺序


Tags: 方法namenew字典pngmappingdictscore
2条回答

因为这些字符串表示文件名,所以我将使用os.path来解析您想要的部分。特别是os.path.basename将删除文件夹并仅检索文件名(例如'3NVC2EB65QZGAZCURNCDJZSS1ILY3F_00_l.png'),然后os.path.splitext将文件名从扩展名中分离出来

>>> import os
>>> {os.path.splitext(os.path.basename(k))[0]: v for k,v in name_score_mapping.items()}
{'31LVTDXBL7AOT2QXJYOJ7PTCYKULRH_00_l': 1.2,
 '3NVC2EB65QZGAZCURNCDJZSS1ILY3F_00_l': 1.6,
 '3KWTYT08703ZOFSZMRBG4OOG64KL5M_00_l': 3.0}

这里有一个简单的方法,可以通过使用str.split()和理解来实现这一点:

>>> d = {
...     'images/distorted/png/31LVTDXBL7AOT2QXJYOJ7PTCYKULRH_00_l.png': 1.2, 
...     'images/distorted/png/3NVC2EB65QZGAZCURNCDJZSS1ILY3F_00_l.png': 1.6, 
...     'images/distorted/png/3KWTYT08703ZOFSZMRBG4OOG64KL5M_00_l.png': 3.0
... }
>>> 
>>> {k.split('/')[-1].split('.')[0]: v for k, v in d.items()}

导致:

{
   '31LVTDXBL7AOT2QXJYOJ7PTCYKULRH_00_l': 1.2, 
   '3NVC2EB65QZGAZCURNCDJZSS1ILY3F_00_l': 1.6, 
   '3KWTYT08703ZOFSZMRBG4OOG64KL5M_00_l': 3.0
}

总而言之,您的代码如下所示:

name_score_mapping = {
    'images/distorted/png/31LVTDXBL7AOT2QXJYOJ7PTCYKULRH_00_l.png': 1.2, 
    'images/distorted/png/3NVC2EB65QZGAZCURNCDJZSS1ILY3F_00_l.png': 1.6, 
    'images/distorted/png/3KWTYT08703ZOFSZMRBG4OOG64KL5M_00_l.png': 3.0
}

new_dict = {
    k.split('/')[-1].split('.')[0]: v
    for k, v in name_score_mapping.items()
}

下面是一个使用pathlib.Path()的额外选项:

from pathlib import Path

name_score_mapping = {
    'images/distorted/png/31LVTDXBL7AOT2QXJYOJ7PTCYKULRH_00_l.png': 1.2, 
    'images/distorted/png/3NVC2EB65QZGAZCURNCDJZSS1ILY3F_00_l.png': 1.6, 
    'images/distorted/png/3KWTYT08703ZOFSZMRBG4OOG64KL5M_00_l.png': 3.0
}

new_dict = {
    Path(k).stem: v
    for k, v in name_score_mapping.items()
}

相关问题 更多 >