我使用的是python2.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发布于 2019-01-11 12:06:48
前言:此答案假设您的意图是搜索与您的搜索字符串完全匹配的内容。这意味着 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)。
发布于 2019-01-11 12:04:42
看起来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发布于 2019-01-11 12:23:20
我只是为此编写了一个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。
https://stackoverflow.com/questions/54140211
复制相似问题