我正在使用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
答案 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