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

2024-06-09 10:20:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用python时遇到了困难,并发现了两个列表之间的差异

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

我希望获得发现差异的输出:

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匹配


Tags: 列表dbabcfincmdbnl1nl2sb7
1条回答
网友
1楼 · 发布于 2024-06-09 10:20:21

为了在使用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

相关问题 更多 >