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]