我有一个名称为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
上进行迭代,如何才能有效地获得所需的输出?
答案 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(按顺序)查找每个名称。
这不是执行此操作的最有效方法,但是,它是一种更直接的方法。