当前位置: 首页 > 面试题库 >

Python:返回列表的第一个元素的索引,使传递的函数为true

谭学名
2023-03-14
问题内容

list.index(x)函数返回值为的第一项列表中的索引x

是否有一个函数,list_func_index()类似于index()具有函数的函数f()作为参数。该函数在列表的f()每个元素上运行e,直到
f(e)返回True。然后list_func_index()返回的索引e

按代码:

>>> def list_func_index(lst, func):
      for i in range(len(lst)):
        if func(lst[i]):
          return i
      raise ValueError('no element making func True')

>>> l = [8,10,4,5,7]
>>> def is_odd(x): return x % 2 != 0
>>> list_func_index(l,is_odd)
3

有没有更优雅的解决方案?(以及该函数的更好的名称)


问题答案:

您可以使用生成器在单行代码中做到这一点:

next(i for i,v in enumerate(l) if is_odd(v))

生成器的好处是它们只能计算所请求的数量。因此,请求前两个索引非常简单(几乎):

y = (i for i,v in enumerate(l) if is_odd(v))
x1 = next(y)
x2 = next(y)

但是,在最后一个索引之后会产生StopIteration异常(这是生成器的工作方式)。知道没有找到这样的值时,这在“先行”方法中也很方便-
list.index()函数将在此处抛出ValueError。



 类似资料:
  • 问题内容: 返回以下内容的最紧凑的方法是什么: 给定一个元组列表,返回一个由元组的第一个(或第二个,无关紧要)元素组成的列表。 对于: 返回的列表将是 问题答案: 如果需要同时使用zip

  • } 嗨,我已经在这方面工作了很长时间,我知道这似乎很容易,但我就是不能理解它....我只能更改getOverM()方法中的代码,我不能编辑其他方法。我想使用if语句,但我只是不知道如何编写一个代码来显示与m相比下一个最大的索引数。 插入GetOverm方法主体的代码。

  • 这里对排序列表也提出了类似的问题,但所使用的解决方案对分不适用于保留排序列表。 假设我有一个列表,按相反的顺序排序,键入中间元素, 我想在中间的元素上应用一系列阈值,它位于一个单独的排序列表中,比如 我试图找出第一个元素的索引小于阈值。在上面的示例中,它应该返回, 建议如何以最快的方式完成?

  • 问题内容: 我知道有一种用于Python列表的方法来返回某些内容的第一个索引: NumPy数组有类似的东西吗? 问题答案: 是的,在给定数组和值的情况下,这是搜索的答案: 结果是具有所有行索引,然后是所有列索引的元组。 例如,如果一个数组是二维的,并且它在两个位置包含你的商品,则 将等于你的项目,因此

  • 问题内容: 如果我有包含10个元素的列表: 为什么l [10]返回IndexError,而l [-1]返回0? 如果列表中没有以前的元素,我想做的就是抛出一个错误。 问题答案: 在Python中,负列表索引表示从列表右边开始计数的项(即的简写形式)。 如果发现需要负索引来指示错误,那么您可以简单地检查这种情况并亲自引发异常(或在那里进行处理):

  • 很抱歉问了一个关于已经讨论过很多次的论点的非常基本的问题,我就是想不出答案。我试着在论坛上搜索已经在主题上提出的问题,但没有找到确切的答案(或者不理解)。 当以不同顺序调用时,为什么此函数会打印两次从i到10的数字?它不应该按同样的顺序打印出来吗?我一直听说递归就是这样工作的:每个函数在其代码中调用另一个相同的函数,只应用于较小的域,直到满足结束条件为止。此时,它应该返回(回溯)到原始函数;这就是