Python,输出两个列表与 * 通配符的差异



我很难使用python并找到两个列表之间的差异。

CMDB列表:

ABC:NL1:SB6
ABC:NL2:SB6
ABC:NL3:SB6
ABC:NL4:SB6
NL9:SB9
NL5:SB4
NL6:SB7

数据库列表:

NL1:SB6
NL2:SB6
ABC:NL3:SB6
ABC:NL4:SB6
ABC:NL8:SB8
ABC:NL5:SB4
ABC:NL6:SB7

我想获得发现差异的输出:

NL9:SB9
ABC:NL8:SB8

我试过了

cmdb_fin = set(cmdb)
db_fin = set(db)
equal = db_fin.symmetric_difference(cmdb_fin)

但是输出类似于以下内容,因为它将精确的字符串相互比较,而不是像"模式">

ABC:NL5:SB4
NL6:SB7
ABC:NL2:SB6
NL2:SB6
ABC:NL8:SB8
NL5:SB4
ABC:NL6:SB7
NL9:SB9
ABC:NL1:SB6
NL1:SB6

有什么方法可以得到我期望的输出吗?

标准:
如果 CMDB 列表中的任何给定字符串(字符块(存在于数据库列表中(它只能是字符串的一部分(,则它不应该在输出中,因为它有点存在于两个列表中。当然,在其他方面 -> DB 与 CMD
相比,例如 CMDB 列表中的NL5:SB4与数据库中的ABC:NL5:SB4匹配

为了在使用python集合时定义自定义相等比较器,您需要定义一个定义了__eq____ne____hash__的自定义类。下面是如何在您的情况下实现此目的的示例,使用每行中的最后两个元素来定义两个元素是否等效。

法典:

class Line(object):
def __init__(self, s):
self.s = s
self.key = ':'.join(s.split(':')[-2:])
def __repr__(self):
return self.s
def __eq__(self, other):
if isinstance(other, Line):
return ((self.key == other.key))
else:
return False
def __ne__(self, other):
return (not self.__eq__(other))
def __hash__(self):
return hash(self.key)
cmdb = ['ABC:NL1:SB6', 'ABC:NL2:SB6', 'ABC:NL3:SB6', 'ABC:NL4:SB6', 'NL9:SB9',
'NL5:SB4', 'NL6:SB7']
db = ['NL1:SB6', 'NL2:SB6', 'ABC:NL3:SB6', 'ABC:NL4:SB6', 'ABC:NL8:SB8',
'ABC:NL5:SB4', 'ABC:NL6:SB7']
cmdb_fin = set(Line(l) for l in cmdb)
db_fin = set(Line(l) for l in db)
equal = db_fin.symmetric_difference(cmdb_fin)

输出:

>>> equal
{ABC:NL8:SB8, NL9:SB9}

用法:

>>> Line('NL5:SB4') == Line('ABC:NL5:SB4')
True

相关内容

  • 没有找到相关文章

最新更新