【问题标题】:How to use a Boolean to exit out of a 'for' loop?如何使用布尔值退出“for”循环?
【发布时间】:2021-08-03 16:46:31
【问题描述】:

我是 Python 的初学者,所以如果我的问题非常基本或明显,我提前道歉。我正在尝试编写一个名为find(my_list, value) 的函数,它接受一个列表和一个值作为参数。该函数在列表中搜索值并返回在列表中第一次出现该值的索引。如果在列表中找不到该值,我希望该函数返回 -1。

问题是我无法使用任何内置函数,range()str() 除外。我也不能使用quit()exit()breakreturn 语句退出循环。

我正在尝试使用“for”循环方法以及布尔语句(控制何时停止循环)。我认为我在正确的轨道上,但相信我的实施存在问题。当列表中的值 not 时,我得到了所需的输出 (-1)。但是,当值在列表中时,我似乎无法获得所需的输出。任何指导将不胜感激。

    def find(my_list, value):

        index = 0
        valid = False

        if value != my_list:
            found = -1

        for element in my_list:
            if element == value:
                valid = True
                found = index

        else: 
            index += 1

    return found

名单:

    str_list1 = ['r', 'i', 'n', 'g', 'i', 'n', 'g']

函数调用:

    print(list_function.find(str_list1, 'g'))
    print(list_function.find(str_list1, 'z'))

预期输出:

    3
    -1

【问题讨论】:

  • 最好抛出异常;如果您忘记检查返回值,这可以防止您以后天真地尝试使用 -1 作为列表索引。
  • 请添加您进行的函数调用,预期和实际返回值
  • @jtlz2 不要修复 Python 代码的缩进;你这样做解决了实际问题。
  • 问题:在 cmets 的一个问题下,有人指出你没有说是否可以使用 len builtin。在我的回答中,我自动假设您可以,因为如果您没有列表长度,range 对列表没有多大意义。那么您可以或不可以在您的解决方案中使用len 吗?
  • @h4z3 len 只有在与range 一起使用时才可以使用。如果我的措辞明智的话:) 例如,range(len(my_list))

标签: python list boolean


【解决方案1】:

遵守使用内置函数和使用break的要求,

def find(my_list, value):
    flag = True
    idx = 0

    while flag:
        for element in my_list:
            if element == value:
                return idx   #only first instance/occurance is returned
            idx += 1
        flag = False   #to break the while-loop, after for-loop has completed

    return -1

其实不需要while循环,见下文

def find(my_list, value):
    idx = 0

    for element in my_list:
        if element == value:
            return idx
        idx += 1

    return -1

如果你能接受.index() 的使用,那就太好了

def find(my_list, value):
    return my_list.index(value) if value in my_list else -1

【讨论】:

    【解决方案2】:

    您可以使用break 退出循环:

    def find(my_list, value):
        index = 0
        found = -1
        for element in my_list:
            if element == value:
                found = index
                break
            index += 1
    
    return found
    

    不要手动计算索引,而是使用enumerate

    def find(list, value):
        found = -1
        for index, element in enumerate(list):
            if element == value:
                found = index
                break
    return found
    

    你可以直接在里面使用return来循环:

    def find(list, value):
        for index, element in enumerate(list):
            if element == value:
                return index
    return -1
    

    或在 else-Block 中设置 index 为:

    def find(list, value):
        for index, element in enumerate(list):
            if element == value:
                break
        else:
            index = -1
    return index
    

    【讨论】:

    • OP 明确表示“我也不能使用 (...) break 或 return 语句退出循环。”
    【解决方案3】:

    如果您不能使用break,请使用while 进行手动for 循环。

    首先让我们用索引将 if 变成一个正确的 for 循环:

            for index in range(len(my_list)):
                element = my_list[index]
                if element == value:
                    valid = True
                    found = index
                    break # I know, it's only for now
    

    现在我们将手动完成它:

            while index < len(my_list):
                element = my_list[index]
                if element == value:
                    valid = True
                    found = index
                    break
                index += 1
    

    现在让我们想一想:我们还能如何完成 while 循环?通过有一个错误的条件!

    让我们将if 条件移动到while 条件但交换(我们希望它在不等于时继续):

            while index < len(my_list) and my_list[index] != value:
                index += 1
    

    现在,如果index == len(my_list),则未找到该元素(条件的第一部分失败)。如果它更低,那么它就是找到的索引。 :)

            while index < len(my_list) and my_list[index] != value:
                index += 1
            return index if index < len(my_list) else -1
    

    编辑:现在我看到我缩短了它相当多...为了保留更多代码,您可以将and not valid 作为条件,这可能是你从一开始就计划好的!

            while index < len(my_list) and not valid:
                element = my_list[index]
                if element == value:
                    valid = True
                index += 1
            return index if valid else -1
    

    【讨论】:

      【解决方案4】:

      您的缩进已关闭。你打算 else go 属于 if 语句,但它实际上绑定到 for 循环,这意味着 index 只有在循环自然退出时才会增加(这总是,因为您没有其他退出循环的方式(break 语句或return 语句)。

      def find(my_list, value):
          index = 0
          for element in my_list:
              if element == value:
                  return index
              else:
                  index += 1
      
          # If we get here, no match was found
          return -1
      

      请注意,我们不需要valid

      更简洁的写法是使用enumerate,它会为您生成索引。

      def find(my_list, value):
          for index, element in enumerate(my_list):
              if element == value:
                  return index
      
          # If we get here, no match was found
          return -1
      

      更新:如果你不能尽早跳出循环,你确实需要valid,尽管你仍然需要保持索引与当前索引分开返回。 (我猜你也不能使用enumerate。)

      def find(my_list, value):
          answer = -1
          index = 0
          for element in my_list:
              if element == value:
                  answer = index
              index += 1
          
          return answer
      

      如果value 出现多次,这将返回找到的最后一个 值的索引。要返回 first 实例,您需要检查 answer 是否已从默认值 -1 更改。

      def find(my_list, value):
          answer = -1
          index = 0
          for element my_list:
              if answer == -1 and element == value:
                  answer = index
              index += 1
          
          return answer
      
          
      

      【讨论】:

      • 我做到了。这是一个蹩脚的要求(尽管它解释了valid 的必要性)。
      • 我删除了我的评论,因为你已经更新了你的答案,除此之外,你认为for idx, i in enumerate(it:=iter(my_list))(海象只是为了在 cmets 中的一行)和做list(it) if元素找到了吗?您使用 enumerate 的解决方案是迄今为止最具可读性和效率的解决方案
      • 这将返回以value 开头的输入的(子)列表,而不是第一次出现的索引。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2014-11-10
      相关资源
      最近更新 更多