从字符串生成字典但交换键和值的函数?
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
我正在尝试制作一个将字符串列表作为输入的函数,如下所示:
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