объединить yield с циклом if / else в python - PullRequest
1 голос
/ 19 марта 2019

Я хочу объединить два слова, разделенных звездочкой (*) в списке французских слов. После объединения этих слов я хочу проверить, существует ли это слово во французском словаре. Если это так, объединенное слово должно остаться в списке, если нет, оно должно быть добавлено в другой список. Я использовал yield (я новичок в этой функции) в своем коде, но что-то не так с моим вложенным циклом if / else. Может ли кто-нибудь помочь мне достичь моей цели? Мой неудачный код ниже:

words = ['Bien', '*', 'venue', 'pour', 'les','engage', '*', 'ment','trop', 'de', 'YIELD', 'peut','être','contre', '*', 'productif' ]

with open ('Fr-dictionary.txt') as fr:
    dic = word_tokenize(fr.read().lower())

l=[ ]

def join_asterisk(ary):
    i, size = 0, len(ary)
    while i < size-2:
        if ary[i+1] == '*':
            if ary[i] + ary[i+2] in dic:
                yield ary[i] + ary[i+2]
                i+=2
            else: yield ary[i]
            i+=1
            l.append(ary[i] + ary[i+2])
    if i < size:
        yield ary[i]



print(list(join_asterisk(words)))

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Генераторы идеально подходят для этого варианта использования, так как вы можете думать о генераторе как о функции, которая будет давать вам полученные значения одно за другим, а не все сразу (как это делает 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]
0 голосов
/ 19 марта 2019

Разве вы не ищете что-то вроде этого:

def join_asterisk(ary):
i, size = 0, len(ary)
while i < size-2:
    if ary[i+1] == '*':
        if ary[i] + ary[i+2] in dic:
            yield ary[i] + ary[i+2]
            i+=2
        else: 
            yield ary[i]
            i+=1
        l.append(ary[i] + ary[i+2])
if i < size:
    yield ary[i]

блок 'else' следует тем же правилам.

Добавление выражения в той же строке слова 'if'Например, предложения 'elif', 'else' или 'while' работают, но если вам нужно больше выражений, связанных с предложением, вы должны использовать отступ или разделять выражения с помощью ';'как это:

while 1:print(9,end='');print(8)
0 голосов
/ 19 марта 2019

Вроде как строки:

        i+=1
        l.append(ary[i] + ary[i+2])

недостаточно отступлены и поэтому не участвуют в else. Это означает, что каждая пара слов с * промежуточным звеном будет добавлена ​​к l вместо пар, не входящих в dic.

...