我很难处理python并发现两个列表之间的差异。
列表:
ABC:NL1:SB6
ABC:NL2:SB6
ABC:NL3:SB6
ABC:NL4:SB6
NL9:SB9
NL5:SB4
NL6:SB7DB列表:
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列表中(它只能是字符串的一部分),那么它不应该在输出中,因为它在两个列表中都存在。当然,在其他方面,-> DB与CMD相比
例如,CMDB列表中的NL5:SB4与DB中的ABC:NL5:SB4匹配。
发布于 2020-01-23 10:48:13
为了在使用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')
Truehttps://stackoverflow.com/questions/59873780
复制相似问题