我很难使用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