В другом ответе уже говорилось, что регулярное выражение не будет совпадать ни с одной строкой с "=" в них, и что ваше сравнение не приведет к вашему выводу, но совпадению вместо этого.
возможно, самая большая проблемав том, что когда вы извлекаете элемент из списка, вы меняете его длину и, следовательно, все индексы элементов внутри.Вот почему ваш вывод более случайный, чем вы ожидали.Если вы вставите ранний элемент, а затем попытаетесь вставить последний элемент, вы также столкнетесь с IndexError
.
. Я настроил код, чтобы не полагаться на индексы.Вероятно, это лучший способ справиться с итерациями, которые меняют длину.
#!/usr/bin/env python3
import re
import random
word_list = ['{a==meliorate}>ed>','{a==meliorate}>s>','{a==meliorate}','{anew}','{annex}>ing>','{anvil}>ed>','{anvil}>ing>','{anvil}','<un<{ban}>ed>','<re<{write}']
new_list=[]
regex = re.compile(r".*({[a-z=]+}).*")
matches=[]
for element in word_list:
m = re.search(regex, element)
if m:
root = m.group(1)
matches.append(root)
target = len(word_list) / 2
while len(new_list) < target:
randroot = random.choice(matches) # select a random {root}
found_words = [w for w in word_list if randroot in w] # get all words with given root in them
if len(found_words) > target - len(new_list):
continue
new_list.extend(found_words)
word_list = [w for w in word_list if w not in new_list] # remove all the words we just added
print(word_list)
print(new_list)
Объяснение изменений: я просто добавил "=" в ваше регулярное выражение, чтобы поймать "a == мелиорат".Я установил цель как переменную, потому что длина word_list
изменится.
Теперь я просто проверяю, находится ли совпадение в строках с word_list
вместо того, чтобы искать точное совпадение.это не полностью защищенный от ошибок подход, но, глядя на ваши входные данные, я думаю, что здесь можно безопасно использовать.
Проверка if
помогает нам удостовериться, что мы получаем четные длины для каждого списка,Например, мы не будем добавлять «== мелиорат», что происходит 3 раза ... если у нас есть только 2 слота для достижения цели.Однако будьте осторожны, если список не может быть равномерно разделен, это вызовет бесконечный цикл.
Мы добавляем найденные слова в new_list
с помощью extend
.И теперь мы перестраиваем word_list
, исключая любые значения, найденные в new_list
..
Результат:
['{a==meliorate}>ed>', '{a==meliorate}>s>', '{a==meliorate}', '{anew}', '<un<{ban}>ed>']
['{annex}>ing>', '{anvil}>ed>', '{anvil}>ing>', '{anvil}', '<re<{write}']