Поиск ключей при переборе 2-мерного словаря в Python 2.7 - PullRequest
0 голосов
/ 24 октября 2018

Мы используем систему справочной службы, которая имеет API, и много билетов создаются из решений для мониторинга, таких как Nagios.Формат всегда один и тот же, о проблеме сообщается с помощью «ПРОБЛЕМА: описание проблемы», а о решении сообщается с помощью «ОК: описание проблемы».Теперь я хочу объединить эти два билета, в которых сообщение о проблеме и сообщении было опубликовано в определенный период времени (5 минут)Для этого:

Я создаю словарь со значениями заявок из системы поддержки.Структура выглядит следующим образом:

dictTickets[IssueID] = Subject, Date

IssueID = уникальный идентификатор заявки.

Затем я проверяю все темы в сообщениях "ОК" и перебираю словарь, чтобы увидеть,было ПРОБЛЕМА-сообщение с тем же субъектом:

if any(tickets['Subject'][len(TermOk):] == first for first, second in dictProblems.values()):

Теперь встает вопрос: если идентифицируется то же сообщение, мне понадобится ключ из словаря билетов для идентификации идентификатора билета.У меня есть идентификатор билета из OK-сообщения, так как я перебираю все из них, но я не знаю, как добраться до ключа из словаря, в котором было найдено значение.

Вы можете помочь?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

any остановится на первом совпадении и не скажет вам, какое оно есть.

Лучше создать понимание списка со совпадениями и циклом на ключе словаря + значения, чтобы проверитьзначения и выдают соответствующие ключи

search_for = tickets['Subject'][len(TermOk):]
result = [ticket_id for ticket_id,(first, second) in dictProblems.items() if search_for == first]
if result:
   # there are matches
   # print them or whatever
0 голосов
/ 24 октября 2018

Вы можете использовать next() с выражением генератора:

next(ticket_id for ticket_id, (subject, _) in dictProblems.items() if tickets['Subject'][len(TermOk):] == subject)

Вы также можете указать значение по умолчанию для next() в качестве второго аргумента, чтобы, если заявка не была найдена с данным субъектом, он вернет None, так что вы также можете использовать его в качестве условия if вместо any():

ticket_id = next((ticket_id for ticket_id, (subject, _) in dictProblems.items() if tickets['Subject'][len(TermOk):] == subject), None)
if ticket_id:
     do_something(ticket_id)

Поскольку идентификатор тикета, вероятно, будет уникальным, next() подходит, так как возвращает значение первого найденного совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...