Python, вывести два списка различий с * подстановочным знаком - PullRequest
0 голосов
/ 23 января 2020

Мне трудно с 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 по сравнению с CMD
, например NL5:SB4 из списка CMDB соответствует ABC:NL5:SB4 из DB

1 Ответ

0 голосов
/ 23 января 2020

Чтобы определить пользовательский компаратор равенства при использовании наборов 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
...