在一个字典中查找键-字符串、值-列表(字符串)格式,是否存在于列表中的值。

5
my_dict = {                              # This dictionary is generated thru
'a' : [ 'value1', 'value4', 'value5' ],  # the info given by the user
'b' : [ 'value2', 'value6', 'value7'],
'c' : [ 'value3', 'value8', 'value9']
}

list = [ 'value1', 'value2' ] # List is generated using list comprehension

我需要生成一个列表,输出类似于以下内容:
output_list = ['a', 'b']

我需要检查 "list" 中的值是否与字典内部列表中的值匹配。这是否可行?

我尝试使用以下代码,但只返回一个空列表:

[key for key, value in my_dict.items() if value in list]

1
你的理解可以转化为 if [ 'value1', 'value4', 'value5' ] in list。顺带一提。 - kylieCatt
谢谢你的评论,Ian! - Juan dela Cruz
1个回答

4

您需要遍历 list(并且不应该使用 list 作为变量名,因为它会掩盖内置的 list 函数)。例如 -

[key for item in lst for key,value in my_dict.items() if item in value]

演示 -

>>> my_dict = {                              # This dictionary is generated thru
... 'a' : [ 'value1', 'value4', 'value5' ],  # the info given by the user
... 'b' : [ 'value2', 'value6', 'value7'],
... 'c' : [ 'value3', 'value8', 'value9']
... }
>>>
>>> lst = [ 'value1', 'value2' ]
>>> [key for item in lst for key,value in my_dict.items() if item in value]
['a', 'b']

如果您使用set而不是list来存储字典中的值,您可以获得更好的性能(因为在集合内搜索是O(1)操作,而在列表内搜索是O(n)操作)。例如:

my_dict = {key:set(value) for key,value in my_dict.items()}
[key for item in lst for key,value in my_dict.items() if item in value]

示例 -

>>> my_dict = {key:set(value) for key,value in my_dict.items()}
>>> pprint(my_dict)
{'a': {'value4', 'value5', 'value1'},
 'b': {'value6', 'value7', 'value2'},
 'c': {'value3', 'value9', 'value8'}}
>>> lst = [ 'value1', 'value2' ]
>>> [key for item in lst for key,value in my_dict.items() if item in value]
['a', 'b']

如果您想检查列表中的任何值是否与字典中的列表中的任何值匹配,可以使用set.intersection函数,并检查结果是否为空。示例 -
[key for key, value in my_dict.items() if set(value).intersection(lst)]

由于字典没有特定的顺序,因此此结果不会被排序。

演示 -

>>> my_dict = {
... 'a' : [ 'value1', 'value4', 'value5' ],
... 'b' : [ 'value2', 'value6', 'value7'],
... 'c' : [ 'value3', 'value8', 'value9']
... }
>>> lst = [ 'value1', 'value2' ]
>>> [key for key, value in my_dict.items() if set(value).intersection(lst)]
['b', 'a']

1
O(1)操作意味着它将在恒定的时间内完成,搜索集合中的项目所需的时间不取决于集合的大小。与此相比,O(n)表示在列表中搜索项目所需的时间取决于列表的大小,因此随着大小的增加,在其中搜索项目将需要更多的时间。 - Anand S Kumar
哇,这意味着很多。谢谢你。我可以在这里提出一个关于代码的后续问题吗?如果我有一个需要与字典中列表中的值进行比较的字符串,该怎么办? - Juan dela Cruz
你需要如何比较字符串的值?我的意思是举一个字符串的例子,并说明您期望的输出结果。 - Anand S Kumar
我已经弄清楚了,Kumar先生。与上面相同的输出。一个包含所有键的列表,这些键包含与用户输入相同的字符串值。我使用了以下代码:[key for key, value in my_dict.items() if user_input in value] - Juan dela Cruz
嗨,库马先生。我有一个后续问题。如果我只需要将lst中的值与字典中每个列表的索引1中的那些项进行比较,该怎么办? - Juan dela Cruz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接