python - 将yield与python中的if/else循环结合起来

标签 python if-statement while-loop yield

我想在法语单词列表中加入由星号 (*) 分隔的两个单词。加入这些单词后,我想检查这个单词是否存在于法语词典中。如果是这样,则连接的单词应保留在列表中,如果不是,则应将其附加到另一个列表中。我在代码中使用了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)))

最佳答案

生成器非常适合这种用例,您可以将生成器视为一个函数,它将一个一个地为您提供生成的值,而不是一次提供所有值(如 return 那样)。换句话说,您可以将其视为不在内存中的列表,只有在需要时您才会获得下一个元素的列表。另请注意,发电机只是构建方式之一 iterators .

在您的情况下,这意味着您不必构建列表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']

另请注意,您可以使用列表理解而不是使用 for 循环来填充两个列表:

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]

关于python - 将yield与python中的if/else循环结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55238598/

相关文章:

python - 如何使用 Pandas 将新行附加到 csv 文件?

python - 对于 python 字符串连接,%s 是否比 + 快

python - 在另一个 Python 包中运行 pytest 测试

c - 如何计算不同利率贷款的利息?

javascript - 如何同时使用 if 和 while Javascript 设置 3 个条件

python - 在 Python 中标记数据(将数据转换为模式)

javascript - 检查多个整数范围时替换多个 if 语句

javascript - 在 .map() 内返回 char.pop() 时的奇怪行为

arrays - 返回前 n 个奇数的方法

代码未验证验证或正确循环