将收益与python中的if / else循环结合起来

时间:2019-03-19 10:20:22

标签: 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)))

3 个答案:

答案 0 :(得分:1)

生成器非常适合此用例,您可以考虑生成器的方式是作为一个函数,该函数将一次给您产生的值,而不是一次给所有值(就像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]

答案 1 :(得分:0)

好像是这样:

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

缩进不足,因此没有参与else。这意味着每对中间带有*的单词将被附加到l上,而不仅仅是dic中不存在的单词对。

答案 2 :(得分:0)

您不是在寻找这样的东西吗?

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)