如何从列表中提取值包含项的对应键?

时间:2019-07-18 02:01:59

标签: python

我有一个清单和一本字典。对于列表中的每个项目,我想在字典中检索其值包含该项目的键。

我尝试编写从列表中获取一项并每次循环遍历字典的代码,以查看值是否包含该项并返回键。我认为这将是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,依此类推。

是否有更优化的方法来实现这一目标?

2 个答案:

答案 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]