使用 while 循环来处理列表中的 return 个字符同时还受其他条件约束的函数

function that uses a while loop to return characters in a list while also being subject to other conditions

前言,因为我正在学习使用while循环,所以我想用只用if语句、in语句和while循环来编写这个函数。我想我可能还需要使用 break 或 continue。我不想使用 for 循环或列表理解形式。

函数本身应该看起来像 take_last(lst)

它通常应该包含一个单词列表,return是列表中删除了第一个和最后一个字符的最后一个值。

例如,

take_last[“Fish”, “Meat”, “Fruit”, “Cake”]

将 return “ak” 因为这是列表中删除字符“C”和“e”的最后一个单词。这部分功能比较简单。我认为可以用

来完成
return (lst[-1])[slice(1,-1)]

但是,它受制于两个不同的条件,这可能会使函数的编写变得困难。

  1. 如果列表中的第一个名字少于 3 个字符,函数将停止并且 return“完成”

take_list([“SH”, “Meat”]) 将停在“SH”处,而不是 returns “finished”.

  1. 否则,如果不满足此条件且第一个单词有 3 个或更多字符,函数将继续遍历列表,直到找到另一个少于 3 个字符的单词。然后它会在此时停止,并且 return 列表中的前一个字符删除了其中的第一个和最后一个字符。

即如果输入是 take_last([“Fish”, “Meat”, “Fruit”, “SH”, “Cake”]) 函数在“SH”处中断,而不是 “rui” 是 returned。 (没有'F

的水果

我在尝试什么

虽然我不确定如何构建 while 循环,但我已经编写了满足第一个条件的函数。

def take_last(lst):
    if len(lst[0]) < 3:
        return "finished"
    else:
        return (lst[-1])[slice(1,-1)]

take_last([“Fish”, “Meat”, “Fruit”, “Cake”]) 将 return “ake”

take_last([“Fi”, “Meat”, “Fruit”, “Cake”])将return

“finished”

我知道在我的函数中的某处我需要一个 elif 语句后跟一个 while 循环,但我不确定这会是什么样子。任何帮助将不胜感激。

这是一个简单的方法。

def take_last(lst):
    i = 0
    while i < len(lst) and len(lst[i]) >= 3:
        i += 1
    if i == 0:
        return "finished"
    else:
        return lst[i-1][1:-1]

只要索引 i 处的字符串至少有 3 个字符长,while 循环就会重复。所以当它完成时,i 包含第一个短字符串的索引;如果没有短元素,它将包含列表的长度。

如果第一个字符串很短,i 将是 0,所以它前面没有元素,我们 return finished.

否则我们return i 之前的元素切片。当没有短元素时,这将是最后一个元素。

所以 return删除第一个和第三个字符的最后一个单词是我们能做的最后一件事。它之前可能有一些条件可能导致函数提前停止。

所以,现在我们知道什么成为我们的默认值 return

  return (lst[-1])[slice(1,-1)]

同样,您检查的第一个条件也是正确的。这样就修复了我们的起始 if.

    if len(lst[0]) < 3:
        return "finished"

现在是条件 2。我们可以在 else 子句中解决这个问题。我们需要遍历列表以查找少于 3 个字符的单词。如果我们找到它,我们 return 截断后它之前的元素。

else:
    i = 1
    while (i < len(lst)):
        if len(lst[i]) < 3:
            return (lst[i-1])[slice(1,-1)]
        i += 1

一切都放在一起:

def take_last(lst):
    if len(lst[0]) < 3:
        return "finished"
    else:
        i = 1
        while (i < len(lst)):
            if len(lst[i]) < 3:
                return (lst[i-1])[slice(1,-1)]
            i += 1
    return (lst[-1])[slice(1,-1)]

您可以使用常规 for 循环轻松完成此操作,对我来说,感觉比使用 while 循环更自然:

def take_last(lst):
    prev = None
    for val in lst:
        if len(val) < 3:
            break
        prev = val
    if prev is None:
        return "finished"
    else:
        return prev[1:-1]