如何从一个映射列表构建字典

4
我有以下字典:
extension_to_type_mapping = {
 'Metadata': ['xls', 'xml', 'xlsx'],
 'Audio': ['ac3', 'aif', 'aiff', 'flac'],
 'Video': ['avi', 'm2t', 'm2v', 'm4v', 'mov', 'mp4', 'mpg', 'mpeg', 'mxf'],
 'Subtitles/Captions': ['cap', 'cc', 'itt', 'scc', 'srt'],
 'Image': ['jpeg', 'jpg', 'png', 'psd', 'tif', 'tiff', 'ts', 'vob', 'wav'],
 'Other': [None,]
}

我希望能够反转映射,这样我就可以调用:
MAPPING['jpg'] ==> 'Metadata'

到目前为止,我有:
MAPPING = {}
for key, list in extension_to_type_mapping.items():
    for i in list:
        MAPPING[i] = key

有没有列表推导或更简单的方法(itertools?)可以做到这一点?

问题不是很清晰。您是否需要一个接受值和字典的函数,并告诉您该值出现在哪个键的集合中,而该键的值是该集合?另外,您给出的具体示例似乎与示例字典不符。 应该是“'Image'”而不是“'Metadata'”吧?它还似乎存在集合值中的标记值,例如None,可能会出现在多个键中。 如果发生这种情况,则映射不是一对一的,因此您可能只有出现该标记值的最终键。 - ely
4个回答

1
使用 字典推导
>>> extension_to_type_mapping = {
...     'Metadata': ['xls', 'xml', 'xlsx'],
...     'Audio': ['ac3', 'aif', 'aiff', 'flac'],
...     'Video': ['avi', 'm2t', 'm2v', 'm4v', 'mov', 'mp4', 'mpg', 'mpeg', 'mxf'],
...     'Subtitles/Captions': ['cap', 'cc', 'itt', 'scc', 'srt'],
...     'Image': ['jpeg', 'jpg', 'png', 'psd', 'tif', 'tiff', 'ts', 'vob', 'wav'],
...     'Other': [None,]
... }
>>> MAPPING = {ext: type_ for type_, exts in extension_to_type_mapping.items()
               for ext in exts}
>>> MAPPING['jpg']
'Image'

顺便提一下,你可以使用mimetypes而不是自己的映射表:

>>> import mimetypes
>>> mimetypes.guess_type('something.jpg')
('image/jpeg', None)

1
>>> {v:k for k, vs in extension_to_type_mapping.items() for v in vs}

1

您可以使用字典推导式(从Python 2.7开始) -

MAPPING = {i:key for key,item in extension_to_type_mapping.items() for i in item}

1
MAPPING = dict()
for k, v in extension_to_type_mapping.items():
    MAPPING.update((i,k) for i in v)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接