Генераторы идеально подходят для этого варианта использования, так как вы можете думать о генераторе как о функции, которая будет давать вам полученные значения одно за другим, а не все сразу (как это делает return).Другими словами, вы можете видеть его как список, который не находится в памяти, список, для которого вы получите следующий элемент, только когда его попросят.Также отметим, что генераторы - это всего лишь один из способов создания итераторов .
В вашем случае это означает, что вам не нужно составлять список l
, чтобы отслеживать правильные значения.Слово как генератор join_asterisk
даст правильные слова для вас.Что вам нужно сделать, так это перебрать все значения, которые даст этот генератор.Это именно то, что сделает list(generator)
, он создаст список, перебирая все значения вашего генератора.
В конце код будет выглядеть следующим образом:
# That look better to me (just in case you change it later)
word_separator = '*'
words = ['Bien', word_separator, 'venue', 'pour', 'les','engage', word_separator, 'ment','trop', 'de', 'YIELD', 'peut', word_separator, "tard"]
# Fake dictionary
dic = {"Bienvenue", "pour", "les", "engagement", "trop", "de", "peut", "peut-être"}
def join_asterisk(ary):
for w1, w2, w3 in zip(words, words[1:], words[2:]):
if w2 == word_separator:
word = w1 + w3
yield (word, word in dic)
elif w1 != word_separator and w1 in dic:
yield (w1, True)
correct_words = []
incorrect_words = []
for word, is_correct in join_asterisk(words):
if is_correct:
correct_words.append(word)
else:
incorrect_words.append(word)
print(correct_words)
print(incorrect_words)
Это выводит
['Bienvenue', 'pour', 'les', 'engagement', 'trop', 'de']
['peuttard']
Также обратите внимание, что вы можете использовать понимание списка вместо использованияцикл, чтобы заполнить два списка:
correct_words = [w for w, correct in join_asterisk(words) if correct]
incorrect_words = [w for w, correct in join_asterisk(words) if not correct]