我有一个清单和一本字典。对于列表中的每个项目,我想在字典中检索其值包含该项目的键。
我尝试编写从列表中获取一项并每次循环遍历字典的代码,以查看值是否包含该项并返回键。我认为这将是O(n2)的复杂性。
my_list = ['1.1.1.1','2.2.2.2','3.3.3.3']
my_dict = {
1234 : '4.4.4.4,5.5.5.5,2.2.2.2',
4567 : '6.6.6.6,7.7.7.7,1.1.1.1',
8910 : '8.8.8.8,9.9.9.9,3.3.3.3'
}
def get_key(my_list, my_dict):
for item in my_list:
for key, value in my_dict.items():
temp_list = []
temp_list = value.split(',')
if item in temp_list:
print(key)
get_key(my_list, my_dict)
Output:
4567
1234
8910
对于项2.2.2.2,应返回键1234,依此类推。
是否有更优化的方法来实现这一目标?
答案 0 :(得分:2)
由于您要查找完全匹配的内容,因此可以反转字典进行搜索。转换一次为O(n),但之后为O(1)。
inverse = {
value: key
for key, values in my_dict.items()
for value in values.split(',')
}
鉴于这种反向结构,您可以直接从列表中查找键:
for item in my_list:
print(inverse[item])
所有项目的求逆和查找均为O(n)。由于循环不是嵌套的,因此总复杂度保持为O(n)。
答案 1 :(得分:0)
您可以使用:
my_list = ['1.1.1.1','2.2.2.2','3.3.3.3']
my_dict = {
1234 : '4.4.4.4,5.5.5.5,2.2.2.2',
4567 : '6.6.6.6,7.7.7.7,1.1.1.1',
8910 : '8.8.8.8,9.9.9.9,3.3.3.3'
}
result = []
for i in my_dict:
s = list(set(my_dict.get(i).split(',')).intersection(my_list))
result.insert(my_list.index(s[0]),i)
print(result)
您将得到这样的输出
[4567, 1234, 8910]