字典键列表中是否存在字符串列表?

list of strings exist within a list of dict keys?

我有一个字符串列表:

ignore_list = ["new job", "encountered error", "SLA"]

和字典列表:

ticket_list =
[{"Title": "new job to action", "Level": "2", "url":"www.example.com"},
{"Title": "job SLA not met", "Level": "4", "url":"www.blabla.com"},
{"Title": "precheck failure", "Level": "1", "url":"www.halp.com"},
{"Title": "is anyone there", "Level": "1", "url":"www.hello.com"},
{"Title": "please update ticket", "Level": "4", "url":"www.asdfadf.com"},
{"Title": "provision assistance", "Level": "2", "url":"www.test.com"},
{"Title": "encountered error on job", "Level": "2", "url":"www.lkjlkj.com"}]

我正在尝试遍历 ignore_list 以及 ticket_list,如果字典键 ['Title' 中不存在任何 ignore_list 字符串].将它们附加到新列表。

action_tickets_list = []
for string in ignore_list:
    for ticket in ticket_list:
        if string not in ticket['Title']:
            action_tickets_list.append(ticket)

print(action_tickets_list)

我的 action_tickets_list 正在通过我的 ignore_list.

每次迭代获取重复项

是否有首选或最佳实践来遍历字符串列表并检查它们是否存在于特定字典键(在本例中为 ['Title'] 键)?我觉得使用 innot in 不是理想的解决方案?

我的目标是 action_tickets_list 包含标题键中没有 ignore_list 字符串的词典。

这一直困扰着我一段时间,一直没有找到解决方案 - 非常感谢任何帮助。上面的代码只是我目前拥有的伪代码,但我希望它足以理解我的目标。提前致谢

对于ignore_list中的每个元素,检查ticket_list中的每个元素;如果 ticket_list['Title'] 不包含 ignore_list 中的元素,则将其添加到 action_tickets_list.

那么,对于 ignore_list 中的每个元素,我们都有 ticket_list 中的每个元素,因此您会看到重复项。

正确的排序应该如下:

action_tickets_list = []
for ticket in ticket_list:
    if not any(map(lambda ignore: ignore in ticket['Title'], ignore_list)):
        action_tickets_list.append(ticket)

print(action_tickets_list)

查看您提供的代码,

action_tickets_list = []
for string in ignore_list:
    for ticket in ticket_list:
        if string not in ticket['Title']:
            action_tickets_list.append(ticket)

打印(action_tickets_list)

action_tickets_list.append(ticket)

每当 ignore_list 中的一个字符串不存在于所检查字典的“标题”槽中时调用。如果“Title”字符串不包含更多 ignore_list.

中的字符串,这将导致重复条目

如果您的目标是在忽略列表中的任何一个条目不存在于字典的“标题”字符串中时包含字典,您可以在外循环中遍历字典列表并在内部循环,如果任何一个字符串不存在,则设置一个布尔值。

action_tickets_list = []
for ticket in ticket_list:
    include = false

    for str in ignore_list:
        if str not in ticket:
            include = true

    if include:
        action_ticket_list.append(ticket)

此解决方案可能会解决您的问题。

将您的门票制作成用户定义的门票 class 并为每个条目使用成员变量而不是使用字典也可能有意义。它可能会提高可读性并更容易避免错误。

这个 class 可能看起来像这样

class Ticket:
    def __init__(self, title, level, url):   
        self.title = title
        self.level = level
        self.url = url

另一种选择是用 any() 和生成器表达式替换 ignore_list 迭代器。

例如,使用集合理解:

action_tickets_list = set(ticket['Title'] for ticket in ticket_list if not any(s in ticket['Title'] for s in ignore_list))

类似于

action_tickets_list = set()
for ticket in ticket_list:
    if not any(s in ticket['Title'] for s in ignore_list):
        action_tickets_list.add(ticket['Title'])

如果你有一个大 ignore_list,可能值得编译 ignore_list 的正则表达式。这意味着您只需扫描一次。

import re
ignore = re.compile('|'.join(ignore_list))
action_tickets_list = set()
for ticket in ticket_list:
    if not ignore.search(ticket['Title']):
        action_tickets_list.add(ticket['Title'])