このアプローチが2つのリストのみである場合は、次のアプローチが有効です。私はこれが最も効率的な解決策であるかどうかはわかりません。
find n-gramsの良い説明はthis blog postです。
この方法は最小長さを提供し、リストの繰り返しシーケンスの最大長(リストの長さの半分以下)を決定します。
次に、個々のリストのシーケンスを組み合わせることによって、各リストのすべてのシーケンスを見つけます。それから、すべてのシーケンスとそのカウントのカウンターがあります。
最後に、複数回出現するすべてのシーケンスの辞書を返します。
def find_repeating(list_a, list_b):
min_len = 2
def find_ngrams(input_list, n):
return zip(*[input_list[i:] for i in range(n)])
seq_list_a = []
for seq_len in range(min_len, len(list_a) + 1):
seq_list_a += [val for val in find_ngrams(list_a, seq_len)]
seq_list_b = []
for seq_len in range(min_len, len(list_b) + 1):
seq_list_b += [val for val in find_ngrams(list_b, seq_len)]
all_sequences = seq_list_a + seq_list_b
counter = {}
for seq in all_sequences:
counter[seq] = counter.get(seq, 0) + 1
filtered_counter = {k: v for k, v in counter.items() if v > 1}
return filtered_counter
何かが不明な場合は教えてください。
>>> list_a = ['a', 'b', 'c', 'd', 'e', 'f', 'e', 'f']
>>> list_b = ['a', 'b', 'd', 'f', 'e', 'f']
>>> print find_repeating(list_a, list_b)
{('f', 'e'): 2, ('e', 'f'): 3, ('f', 'e', 'f'): 2, ('a', 'b'): 2}
あなたが解決しようとしている実際の問題は何ですか? [mcve]:これらのリスト内のオブジェクトのパターンが達成するオブジェクトのタイプを確認してください。 – TemporalWolf