У меня есть три строки, которые являются объединением трех компонентов:
- одно слово из списка 1 (включает пустую строку)
- одно слово из списка 2
- одно слово из списка 3 (включает пустую строку)
Списки 1, 2 и 3 могут содержать до 5000 элементов. Элементы в одном списке отсутствуют в других (кроме пустой строки). Однако есть слова, которые могут быть частью других слов.
Я ищу эффективный способ найти три компонента. Прямо сейчас я делаю следующее:
for word in list2:
if word in long_word:
try:
[bef, aft] = long_word.split(word)
except ValueError: # too many values to unpack
continue
if bef in list1 and aft in list3:
print('Found: {}, {}, {}'.format(bef, word, aft))
break
else:
print('Not found')
Интересно, есть ли лучший способ? Я думал об использовании трубы в регулярном выражении. Но кажется, что количество альтернатив слишком велико, как я получаю: OverflowError: превышен предел размера кода регулярного выражения.
Спасибо
Обновление
Я попробовал модифицированную версию предложенного решения:
def fj(long_word, list1, list2, list3):
for x in filter(long_word.startswith, list1):
for y in filter(long_word[len(x):].startswith, list2):
z = long_word[len(x)+len(y):]
if z in list3:
yield x, y, z
def sid(long_word, list1, list2, list3):
for w1 in list1:
if not long_word.startswith(w1):
continue
cut1 = long_word[len(w1):]
for w2 in list2:
if not cut1.startswith(w2):
continue
cut2 = cut1[len(w2):]
for w3 in list3:
if cut2 == w3:
yield w1, w2, w3
def my(long_word, list1, list2, list3):
for word in list2:
if word in long_word:
try:
[bef, aft] = long_word.split(word)
except ValueError: # too many values to unpack
continue
if bef in list1 and aft in list3:
yield bef, word, aft
Это (нормализованные) результаты для времени, которое я получаю, используя списки с 8000 элементов, повторяющимися 10000 раз, каждый раз выбирая случайным образом одно слово из каждого списка для генерации long_word
- мой: 1,0
- sid: 4.5
- FJ: 2,7
Я действительно удивлен, поскольку думал, что метод fj будет самым быстрым.