Python-列表键和dict键之间的交集



我有这个列表:

list1 = [{'Hello'}, {'Welcome'}, {'BYE'}]

我有一本字典:

dict1 = {'Welcome': 5, 'BYE': 3, 'How are you': 3}

我希望结果是这样的:

dict2 = {'Welcome': 5, 'BYE': 3}

根据这篇帖子。我试过了:

dict2 = {k: dict1[k] for k in (dict1.keys() & list1)}

但上面写着:

类型错误:不可更改类型:"set">

我需要先做list1吗,像这样:

list1 = ['Hello', 'Welcome', 'BYE']

如果这就是问题所在,那么怎么办呢?

您可以从list1:生成一组值

list1 = [{"Hello"}, {"Welcome"}, {"BYE"}]
dict1 = {"Welcome": 5, "BYE": 3, "How are you": 3}

dict2 = {k: dict1[k] for k in (dict1.keys() & {v for s in list1 for v in s})}
print(dict2)

打印:

{'BYE': 3, 'Welcome': 5}

如果需要从列表列表中那个奇怪的单个项目集开始,我会用itertools.chain.from_iterable将其展开为一个简单的列表。从那里,通过简单的字典理解,您可以为list1:中存在的CCD_3中的每个键创建一个新的字典

>>> from itertools import chain
>>> list1 = [{'Hello'}, {'Welcome'}, {'BYE'}]
>>> dict1 = {'Welcome': 5, 'BYE': 3, 'How are you': 3}
>>> list(chain.from_iterable(list1))
['Hello', 'Welcome', 'BYE']
>>> {k: dict1[k] for k in chain.from_iterable(list1) if k in dict1}
{'Welcome': 5, 'BYE': 3}

是的,您的变量list1是集合的列表,您可以这样做:

dict2 = {k: dict1[k] for k in set(dict1.keys()).intersection(set().union(*list1))}

最新更新