我们正在使用一个服务台系统,该系统具有API,并且大量票证来自诸如Nagios的监视解决方案。格式始终相同,用“问题:问题描述”报告问题,用“确定:问题描述”报告解决方案。我现在要合并在特定时间范围(5分钟)内已发布问题和确定消息的那两个票证。为此:
我使用帮助台系统中的票证值创建字典。 结构如下:
dictTickets[IssueID] = Subject, Date
IssueID =票证的唯一标识符。
然后我从“确定”消息中检查所有主题,并遍历字典以查看是否存在具有相同主题的问题消息:
if any(tickets['Subject'][len(TermOk):] == first for first, second in dictProblems.values()):
现在是一个问题: 如果识别出相同的消息,我将需要门票字典中的密钥来识别门票ID。我从OK消息中获取了票证ID,因为我要遍历所有票证,但是我不知道如何从匹配值的字典中获取密钥。
你能帮忙吗?
答案 0 :(得分:1)
您可以将next()
与生成器表达式一起使用:
next(ticket_id for ticket_id, (subject, _) in dictProblems.items() if tickets['Subject'][len(TermOk):] == subject)
您还可以将next()
的默认值指定为第二个参数,这样,如果找不到与给定主题相关的票证,它将返回None
,因此您可以将其用作您的以及if
的{{1}}条件:
any()
由于票证ID可能是唯一的,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)
非常适合,因为它将返回找到的第一个匹配项的值。
答案 1 :(得分:1)
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