根据字典分配值

时间:2019-08-07 21:57:15

标签: python dictionary

我有一个名称为list1的列表:

   ["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上进行迭代,如何才能有效地获得所需的输出?

4 个答案:

答案 0 :(得分:5)

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

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

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

[categories[name] for name in list1]

返回:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

有两种方法可以达到目标。

您打算使用的方式是使用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]

答案 3 :(得分:0)

我相信以下内容将为您提供所需的输出:

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

    lista = []
    for key in D.keys():
        for name in L:
            if name in D[key]:
                lista.append(key)
    print(lista)

D.keys()部分以友好的方式为您提供了一系列的键(例如, [“ NICE”,“ BAD”,“ GOOD”] )。

对此进行迭代,然后在字典中从L(按顺序)查找每个名称。

这不是执行此操作的最有效方法,但是,它是一种更直接的方法。