首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找字典以查找键值

查找字典以查找键值
EN

Stack Overflow用户
提问于 2019-01-11 11:58:49
回答 4查看 95关注 0票数 0

我使用的是python2.7,我有以下字典

代码语言:javascript
复制
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,它能够给我所有具有该值的键,然后能够获得该键的完整值列表。

我有以下代码,但没有生成任何内容

代码语言:javascript
复制
x = "port-security maximum 10"

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

回答 4

Stack Overflow用户

发布于 2019-01-11 12:06:48

前言:此答案假设您的意图是搜索与您的搜索字符串完全匹配的内容。这意味着 x = 'port-security maximum 10' 在最初的问题中是一个打字错误。如果您想搜索部分字符串,则必须像其他答案所建议的那样进行线性搜索(除非您预先构建了trie,但我不想深入讨论这一点)。

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

如果这是您需要经常执行的操作,请颠倒字典。字典的全部意义在于允许快速查找关键字。对多个值进行线性搜索似乎非常不好地使用数据结构:

代码语言:javascript
复制
reversed = {}
for name, val in my_dict.iteritems():
    for key in val:
        if key not in reversed:
            reversed[key] = set()
        reversed[key].add(name)

现在您只需执行以下操作:

代码语言:javascript
复制
reversed["switchport port-security maximum 10"]

要获得

代码语言:javascript
复制
set(['GI2/1/1', 'GI2/1/3'])

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

票数 2
EN

Stack Overflow用户

发布于 2019-01-11 12:04:42

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

代码语言:javascript
复制
x = "port-security maximum 10"

for name, val in my_dict.iteritems():
    for v in val:
        if x in v:
            print name
票数 1
EN

Stack Overflow用户

发布于 2019-01-11 12:23:20

我只是为此编写了一个for循环。

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54140211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档