Если ваши строки всегда являются словами, вы можете просто разделить слова и отфильтровать их по set
операциям, что должно быть довольно быстрым.
from collections import Counter
items = ["Hanks", "Tom Hanks","Tom","Tom Can"]
items = set(items) # Don't want to think about uniqueness
item_words = {} # {item: all_words}
word_counts = Counter() # {word: item_counts}
word_lookups = {} # {word: {all_words: {item, ...}, ...}, ...}
for item in items:
words = frozenset(item.split())
item_words[item] = words
for word in words:
word_lookups.setdefault(word, {}).setdefault(words, set()).add(item)
word_counts[word] += 1
def is_ok(item):
words = item_words[item]
min_word = min(words, key=word_counts.__getitem__)
if word_counts[min_word] == 1:
return True # This item has a unique word
for all_words, others in word_lookups[min_word].items():
if not words.issubset(all_words):
continue # Not all words present
for other in others:
if item == other:
continue # Don't remove yourself
if item in other:
return False
return True # No matches
final = [item for item in items if is_ok(item)]
Если вы хотите быть очень быстрым, рассмотрите вариант алгоритма Aho – Corasick , в котором вы должны построить шаблоны для всех ваших записей и сопоставить их со всеми вашими входными данными и отбросить любые шаблоны, которые имеют более одного совпадения. Это потенциально может быть линейным во времени.