搜索字典以查找键值

时间:2019-01-11 03:58:49

标签: python python-2.7

我正在使用python 2.7,并且具有以下字典

my_dict = {}

my_dict["GI2/1/1"] = [
'switchport port-security maximum 10', 
'switchport port-security maximum 3 vlan access', 
'switchport port-security maximum 1 vlan voice', 
'switchport port-security aging time 25', 
'switchport port-security aging type inactivity', 
'switchport port-security'
]

my_dict["GI2/1/2"] = [
'switchport port-security maximum 5', 
'switchport port-security maximum 5 vlan access', 
'switchport port-security maximum 3 vlan voice', 
'switchport port-security aging time 20', 
'switchport port-security aging type inactivity', 
'switchport port-security'
]


my_dict["GI2/1/3"] = [
'switchport port-security maximum 10', 
'switchport port-security maximum 3 vlan access', 
'switchport port-security maximum 1 vlan voice', 
'switchport port-security aging time 25', 
'switchport port-security aging type inactivity', 
'switchport port-security'
]

我希望能够搜索值,让我们说出类似switchport port-security maximum 10之类的内容,并使其能够给我所有具有该键的键,然后能够获取完整的值列表那个钥匙。

我有以下代码,但什么也没产生

x = "port-security maximum 10"

for name, val in my_dict.iteritems():
    if x in val:
        print name

4 个答案:

答案 0 :(得分:2)

前言:此答案假设您的意图是搜索与您的搜索字符串完全匹配的对象。这意味着x = 'port-security maximum 10'是原始问题的错字。如果要搜索部分字符串,则必须像其他答案所建议的那样进行线性搜索(除非您先构建了Trie,但我不想这样做)。

您的直接问题是x并不像单词中的所有字符串一样都以switchport开头,因此当然找不到它。您的循环实际上完全正常。

如果这是您需要经常执行的操作,请反转字典。字典的全部目的是允许快速键查找。跨多个值进行线性搜索似乎很错误地使用了数据结构:

reversed = {}
for name, val in my_dict.iteritems():
    for key in val:
        if key not in reversed:
            reversed[key] = set()
        reversed[key].add(name)

现在您可以这样做:

reversed["switchport port-security maximum 10"]

获得

set(['GI2/1/1', 'GI2/1/3'])

我使用集合而不是列表来允许my_dict中的值包含重复项。如果这种情况永远不会发生,那么最好使用列表(.append而不是.add)。

答案 1 :(得分:1)

如果if语句应该在字符串中搜索x,但由于val是一个列表,它实际上是在列表中进行检查。在val上添加另一个循环,以获得所需的行为,

x = "port-security maximum 10"

for name, val in my_dict.iteritems():
    for v in val:
        if x in v:
            print name

答案 2 :(得分:1)

我正在为此编写一个for循环。

for name, val in my_dict.items():
    v = map(lambda l: l.find(x) >= 0, val)
    if any(v):
        print (name)

由于您要搜索的内容不完全匹配,因此您需要获取find返回的索引。如果任何一个值为true,则最后一个any返回true。

答案 3 :(得分:0)

使用此:

for name, val in my_dict.iteritems():
    combined = '\t'.join(val)
    if x in combined:
        print name