基于di赋值

2024-10-03 21:24:13 发布

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

我有一个名字列表1:

   ["SAM","TOM","LOUIS"]

我有这样一个dict1(在值列表中没有重复的名称:

{"NICE": ["SAM", "MAIK", "CARL", "LAURA", "MARTH"],
 "BAD": ["LOUIS", "TOM", "KEVIN"],
 "GOOD": ["BILL", "JEN", "ALEX"]}

我如何遍历list1,以便在dict1的任何列表中出现任何名称时,它会为dict分配相应的键

我期待生成以下输出:

["NICE","BAD","BAD"]

对应于列表中出现的值的键:SAM,TOM,LOUIS

我就是这么想的:

lista=[]
for k,v in dict1:
    for values in arr1:
        if values in v:
            lista.append(v)
lista

但是,我不知道如何迭代不同的v,如何才能以有效的方式获得所需的输出


Tags: in名称列表forsam名字badvalues
3条回答

您可以创建一个中间dict,将名称映射到dict1中的键:

categories = {name: category for category, names in dict1.items() for name in names}

因此,您可以使用以下方法将list1中的名称有效地映射到它们各自的键:

[categories[name] for name in list1]

返回:

['NICE', 'BAD', 'BAD']

我想您需要这里的items()字典函数。对于每个名称,遍历所有字典对,找到匹配项时停止,将相应的形容词添加到列表中

lista = []
for name in list1:
    for adjective, names in dict1.items():
        if name in names:
            lista.append(adjective)
            break
return lista

有两种方法可以达到你的目的

您打算使用dict1.items()的方式。不幸的是,这种方法计算速度很慢,因此为了完整性,我将添加更有效的方法:

# First, convert the dict to a different representation:
from itertools import chain, repeat

# Change {k: [v1,v2], k2: [v3,v4]} to {v1: k, v2: k, v3: k2, v4: k2}
name_to_adjective = dict(chain.from_iterable(zip(v, repeat(k)) for k, v in a.items()))

名称到形容词现在等于:

{'ALEX': 'GOOD',
 'BILL': 'GOOD',
 'CARL': 'NICE',
 'JEN': 'GOOD',
 'KEVIN': 'BAD',
 'LAURA': 'NICE',
 'LOUIS': 'BAD',
 'MAIK': 'NICE',
 'MARTH': 'NICE',
 'SAM': 'NICE',
 'TOM': 'BAD'}

然后,您可以在一次运行中获得结果:

result = [name_to_adjective[name] for name in list1]

相关问题 更多 >