从字符串生成字典但交换键和值的函数?

Function that makes dict from string but swaps keys and values?

我正在尝试制作一个将字符串列表作为输入的函数,如下所示:

def swap_values_dict(['Summons: Bahamut, Shiva, Chocomog',
 'Enemies: Bahamut, Shiva, Cactaur'])

并使用冒号后的词作为键,冒号前的词作为值,从中创建字典。我需要澄清的是,此时,列表中只有两个字符串。我计划将字符串拆分为子列表,然后尝试将它们分配给字典。

输出应该类似于

{'Bahamut': ['Summons','Enemies'],'Shiva':['Summons','Enemies'],'Chocomog':['Summons'],'Cactaur':['Enemies']}

如您所见,原始列表中冒号后的词已成为键,而冒号前的词(类别)已成为值。如果其中一个值出现在两个列表中,则在最终字典中为它分配两个值。我希望能够从许多不同大小的列表中制作出类似的字典,而不仅仅是包含两个字符串的列表。 这是否可以在没有列表理解的情况下仅用于循环和 if 语句来完成?

到目前为止我已经尝试过什么

title_list = []
for i in range(len(mobs)):#counts amount of strings in list
    titles = (mobs[i].split(":"))[0] #gets titles from list using split
    title_list.append(titles)
title_list

此代码 returns ['Summons', 'Enemies'] 这不是我想要收到的结果,但我认为它们可以帮助我编写函数。我曾计划将键和值分离到单独的列表中,然后将它们作为字典压缩在一起。

尝试:

def swap_values_dict(lst):
    tmp = {}
    for s in lst:
        k, v = map(str.strip, s.split(":"))
        tmp[k] = list(map(str.strip, v.split(",")))

    out = {}
    for k, v in tmp.items():
        for i in v:
            out.setdefault(i, []).append(k)

    return out


print(
    swap_values_dict(
        [
            "Summons: Bahamut, Shiva, Chocomog",
            "Enemies: Bahamut, Shiva, Cactaur",
        ]
    )
)

打印:

{
    "Bahamut": ["Summons", "Enemies"],
    "Shiva": ["Summons", "Enemies"],
    "Chocomog": ["Summons"],
    "Cactaur": ["Enemies"],
}

我会使用 defaultdict。它省去了手动检查字典中是否存在键并构建新的空列表的麻烦,从而使功能相当简洁:

from collections import defaultdict

def swap_values_dict(mobs):
    result = defaultdict(list)
    
    for elem in mobs:
        role, members = elem.split(': ')
        for m in members.split(', '):
            result[m].append(role)

    return result