我使用python 2.7,我有以下列表:
list1 = ['switchport port-security maximum', 'switchport port-security aging']然后我有一本这样的字典:
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()来匹配所有的内容,但是我只想看看这两个条目是否都存在。
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在两个条目上都不匹配
发布于 2019-01-11 17:40:58
您可以创建一个捕获结果的新dict。
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并检查所有项目。
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的答复)。
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]如果我们只有列表,并希望布尔人看子列表是否匹配,我们正在寻找的,那么上面可能是一个可能的解决方案。
发布于 2019-01-11 17:41:36
你可以简单地使用str.startswith (如果你不在乎位置,你可以坚持使用in),并将它与all和any结合起来
代码
for name, val in my_dict.iteritems():
if all(any(v.startswith(l) for v in val) for l in list1):
print name您可以使用正则表达式,尽管它可能会导致过度死亡。
代码
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输出
GI2/1/1
GI2/1/2我认为这两种方法都是可以理解的:只要看看它们,你就知道它们是做什么的。
希望这对你有帮助!
发布于 2019-01-11 17:25:44
我不知道我是否明白你想要什么但像什么?
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(如果要列出与约束匹配的所有条目,只需删除中断)
https://stackoverflow.com/questions/54151159
复制相似问题