Python 在具有快速性能的集合列表中查找模式

Python 在具有快速性能的集合列表中查找模式,python,Python,设置 给定一个集合列表: mylist = [{'a','the'}, {'red', 'brown', 'white'}, {'dog', 'cat'}] 我需要验证mylist中是否包含任何给定列表的元素 pattern_match(['a', 'red', 'dog'], mylist) # True pattern_match(['a', 'grey', 'cat'], mylist) # False, because of 'grey' 原始解决方案 我将模式匹配表达为 def

设置

给定一个集合列表:

mylist = [{'a','the'}, {'red', 'brown', 'white'}, {'dog', 'cat'}]
我需要验证mylist中是否包含任何给定列表的元素

pattern_match(['a', 'red', 'dog'], mylist) # True

pattern_match(['a', 'grey', 'cat'], mylist) # False, because of 'grey'
原始解决方案

我将模式匹配表达为

def pattern_match(sequence, patterns):
    if len(sequence) == len(patterns):
        return all([sequence[i] in patterns[i] for i in range(len(patterns))])
    else:
        return False
这对于检查像
['a','brown','dog']
这样的单个序列非常有效,代码清晰易懂

检查多个序列的问题

我需要在相当长的集合列表上及时地对大量的序列执行此操作,如
['a'、'brown'、'dog']

给定

在考虑性能的情况下,实现与以下代码相同结果的最佳方法是什么

[pattern_match(seq, mylist) for seq in mysequences] # yields [True, False, ...]

您可以在
模式匹配功能中优化性能:

def pattern_match(sequence, patterns):
    if len(sequence) == len(patterns):
        return all(item in my_set for item, my_set in zip(sequence, patterns))
    else:
        return False

通过取消列表理解,我们可以在第一次检查失败时停止检查。

我建议这样做:

def pattern_match(sequence, patterns):
    seq = set(sequence)
    u = set()
    for pattern in patterns:
        u.update(pattern) #includes pattern members in u
    return seq.issubset(u) # checks if sequence is subset of u
issubset()
update()
都有文档记录。但是,根据用例的不同,您可能需要在函数外部构造u,并将最终值传递给
pattern\u match
,如果
my\u list
对于许多调用都是固定的,以避免在每次调用中重建u:

u = set()
for pattern in my_list:
    u.update(pattern)

results = [pattern_match(seq, u) for seq in mysequences] 

当前,您正在搜索每个集合,即使其中一个设置为
False
。一种方法是,一旦找到
False
值,就停止搜索集合列表。
u = set()
for pattern in my_list:
    u.update(pattern)

results = [pattern_match(seq, u) for seq in mysequences]