首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从一组值的列表中进行匹配

从一组值的列表中进行匹配
EN

Stack Overflow用户
提问于 2019-01-11 17:13:03
回答 4查看 108关注 0票数 1

我使用python 2.7,我有以下列表:

代码语言:javascript
复制
list1 = ['switchport port-security maximum', 'switchport port-security aging']

然后我有一本这样的字典:

代码语言: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'
]

我试图找到一种方法来搜索值,但是它需要匹配list1中的两个条目。

我有以下的代码,但它会匹配一个,然后爆发,我知道它为什么会爆发,但我想不出一个方法来强迫它在两个条目上匹配,然后突破。我知道我可以使用all()来匹配所有的内容,但是我只想看看这两个条目是否都存在。

代码语言:javascript
复制
for name, val in my_dict.iteritems():
    for v in val:
        for i in list1:
            if i in v:
                print name
                break

目标是只输出GI2/1/1和GI2 2/1/2,因为GI2/1/3在两个条目上都不匹配

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-01-11 17:40:58

您可以创建一个捕获结果的新dict

代码语言:javascript
复制
result = {key: set([item for item in list1 for things in val if item in things]) for key, val in my_dict.iteritems()}
#{'GI2/1/1': {'switchport port-security maximum', 'switchport port-security aging'}, 'GI2/1/2': {'switchport port-security maximum', 'switchport port-security aging'}, 'GI2/1/3': {'switchport port-security maximum'}}

result = [key for key, val in result.iteritems() if val == set(list1)]
#['GI2/1/1', 'GI2/1/2']

这当然可以在一行中完成,但我认为,通过两个步骤可以更容易地了解所发生的事情。我将所有匹配存储在一个列表中,该列表被转换为一个set (删除重复项),然后将其与list1中所需的匹配进行比较。

编辑:@blhsing指出,python中的set是无序的。我不是用我在result中的值制作一个set,而是用list1制作一个set,因为我认为OP不会在list1中复制。

另一种方法是使用all并检查所有项目。

代码语言:javascript
复制
result = {key: set([item for item in list1 for things in val if item in things]) for key, val in my_dict.iteritems()}

result = [key for key, val in result.iteritems() if all([config in val for config in list1])]
# ['GI2/1/1', 'GI2/1/2']

编辑#2:因为OP在评论中的要求。这是另一种潜在的方法。(以下为@JosuéCortina的答复)。

代码语言:javascript
复制
my_list = [[
'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 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'
], [
'switchport port-security maximum 10', 
'switchport port-security maximum 3 vlan access', 
'switchport port-security maximum 1 vlan voice',  
'switchport port-security'
]]

result = []
for sub_list in my_list:
    if all([True if any([config in item for item in sub_list]) else False for config in list1]):
        result.append(True)
    else:
        result.append(False)

#[True, True, False]

如果我们只有列表,并希望布尔人看子列表是否匹配,我们正在寻找的,那么上面可能是一个可能的解决方案。

票数 -1
EN

Stack Overflow用户

发布于 2019-01-11 17:41:36

你可以简单地使用str.startswith (如果你不在乎位置,你可以坚持使用in),并将它与allany结合起来

代码

代码语言:javascript
复制
for name, val in my_dict.iteritems():
    if all(any(v.startswith(l) for v in val) for l in list1):
        print name

您可以使用正则表达式,尽管它可能会导致过度死亡。

代码

代码语言:javascript
复制
import re

regexps = [re.compile(i) for i in list1]

for name, val in my_dict.iteritems():
    if all(any(regexp.match(v) for v in val) for regexp in regexps):
        print name

输出

代码语言:javascript
复制
GI2/1/1
GI2/1/2

我认为这两种方法都是可以理解的:只要看看它们,你就知道它们是做什么的。

希望这对你有帮助!

票数 1
EN

Stack Overflow用户

发布于 2019-01-11 17:25:44

我不知道我是否明白你想要什么但像什么?

代码语言:javascript
复制
def cont(l,s):
    for i in l:
        if s in i:
            return True
    return False

for name, val in my_dict.iteritems():
        happy=True
        for i in list1:
            if not cont(val,i):
                happy=False
        if happy:
            print name
            break

(如果要列出与约束匹配的所有条目,只需删除中断)

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

https://stackoverflow.com/questions/54151159

复制
相关文章

相似问题

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