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

在列表中找到第n个项目的索引

蒙光华
2023-03-14
问题内容

我想在列表中找到第n个项目的索引。例如,

x=[False,True,True,False,True,False,True,False,False,False,True,False,True]

第n个正确的索引是多少?如果我想要第五次出现(如果索引为零,则为第四次出现),答案是10。

我想出了:

indargs = [ i for i,a in enumerate(x) if a ]
indargs[n]

请注意,x.index返回第一个匹配项或某个点之后的第一个匹配项,因此据我所知不是解决方案。

numpy中也有类似上述情况的解决方案,例如,使用cumsumwhere,但是我想知道是否有无numpy的方式来解决问题。

自从我在为Euler项目实施Eratosthenes筛网时首次遇到此问题以来,我一直对性能感到担忧,但这是我在其他情况下遇到的更普遍的问题。

编辑:我得到了很多很好的答案,所以我决定做一些性能测试。以下是timeit带有len元素的列表的执行时间(以秒为单位),其中html" target="_blank">元素搜索第4000/1000个True。列表是随机的True
/ False。源代码链接如下;有点杂乱。我使用发布者名称的简短版本/修改版本来描述功能,除了listcomp,这是上面的简单列表理解。

True Test (100'th True in a list containing True/False)
         nelements      eyquem_occur eyquem_occurrence            graddy            taymon          listcomp       hettinger26         hettinger
             3000:          0.007824          0.031117          0.002144          0.007694          0.026908          0.003563          0.003563
            10000:          0.018424          0.103049          0.002233          0.018063          0.088245          0.003610          0.003769
            50000:          0.078383          0.515265          0.002140          0.078074          0.442630          0.003719          0.003608
           100000:          0.152804          1.054196          0.002129          0.152691          0.903827          0.003741          0.003769
           200000:          0.303084          2.123534          0.002212          0.301918          1.837870          0.003522          0.003601
True Test (1000'th True in a list containing True/False)
         nelements      eyquem_occur eyquem_occurrence            graddy            taymon          listcomp       hettinger26         hettinger
             3000:          0.038461          0.031358          0.024167          0.039277          0.026640          0.035283          0.034482
            10000:          0.049063          0.103241          0.024120          0.049383          0.088688          0.035515          0.034700
            50000:          0.108860          0.516037          0.023956          0.109546          0.442078          0.035269          0.035373
           100000:          0.183568          1.049817          0.024228          0.184406          0.906709          0.035135          0.036027
           200000:          0.333501          2.141629          0.024239          0.333908          1.826397          0.034879          0.036551
True Test (20000'th True in a list containing True/False)
         nelements      eyquem_occur eyquem_occurrence            graddy            taymon          listcomp       hettinger26         hettinger
             3000:          0.004520          0.004439          0.036853          0.004458          0.026900          0.053460          0.053734
            10000:          0.014925          0.014715          0.126084          0.014864          0.088470          0.177792          0.177716
            50000:          0.766154          0.515107          0.499068          0.781289          0.443654          0.707134          0.711072
           100000:          0.837363          1.051426          0.501842          0.862350          0.903189          0.707552          0.706808
           200000:          0.991740          2.124445          0.498408          1.008187          1.839797          0.715844          0.709063
Number Test (750'th 0 in a list containing 0-9)
         nelements      eyquem_occur eyquem_occurrence            graddy            taymon          listcomp       hettinger26         hettinger
             3000:          0.026996          0.026887          0.015494          0.030343          0.022417          0.026557          0.026236
            10000:          0.037887          0.089267          0.015839          0.040519          0.074941          0.026525          0.027057
            50000:          0.097777          0.445236          0.015396          0.101242          0.371496          0.025945          0.026156
           100000:          0.173794          0.905993          0.015409          0.176317          0.762155          0.026215          0.026871
           200000:          0.324930          1.847375          0.015506          0.327957          1.536012          0.027390          0.026657

Hettinger的itertools解决方案几乎总是最好的。taymon和graddy的解决方案在大多数情况下是次佳的解决方案,但是当您想要第n个实例(例如,n为高)或出现次数少于n的列表时,列表理解方法可能更适合短数组。如果出现的次数少于n次,则初始count检查可以节省时间。另外,当搜索数字而不是True
/
False时,graddy的效率更高…尚不清楚为什么。eyquem的解决方案在本质上与其他解决方案等效,只是开销略有不同。eyquem_occur与taymon的解近似相同,而eyquem_occurrence与listcomp相似。


问题答案:

@Taymon使用 list.index 的答案很棒。

FWIW,这是使用itertools模块的功能性方法。它适用于任何可迭代的输入,而不仅仅是列表:

>>> from itertools import compress, count, imap, islice
>>> from functools import partial
>>> from operator import eq

>>> def nth_item(n, item, iterable):
        indicies = compress(count(), imap(partial(eq, item), iterable))
        return next(islice(indicies, n, None), -1)

该示例很好,因为它展示了如何有效地组合Python的功能工具集。请注意,一旦建立了管道,Python的eval循环就不会发生任何事情-
一切都以C速度完成,占用的内存很小,具有惰性的求值方式,没有变量分配,并且具有可单独测试的组件。IOW,这是功能程序员梦dream以求的一切:-)

样品运行:

>>> x = [False,True,True,False,True,False,True,False,False,False,True,False,True]
>>> nth_item(50, True, x)
-1
>>> nth_item(0, True, x)
1
>>> nth_item(1, True, x)
2
>>> nth_item(2, True, x)
4
>>> nth_item(3, True, x)
6


 类似资料:
  • 问题内容: 我有一个清单清单: 搜索列表并返回其中一项的位置的最干净方法是什么? 我已经看过该方法,但是似乎并没有在列表中解压缩列表。 给出:,不是我所期望的… 问题答案: 我会做这样的事情: 这将返回一个元组列表,其中第一个索引是第一个列表中的位置,第二个索引是第二个列表中的位置(注意:您要查找的颜色,即)。 对于问题中的示例,返回值为: 如果您只需要懒惰地找到找到颜色的第一个位置,则可以使用以

  • 问题内容: 嘿。我有一个很大的数组,我想找到第N个最大值。我可以简单地对数组进行排序,然后采用第N个元素,但是我只对一个元素感兴趣,因此可能有比对整个数组进行排序更好的方法… 问题答案: 排序至少需要O(nlogn)运行时间- 有非常有效的选择算法可以在线性时间内解决您的问题。 (有时是),它基于quicksort(递归分区)的思想,是一个很好的解决方案(请参阅伪代码的链接+另一个示例)。

  • 问题内容: 我想在cte中提供一个能够从具有给定索引(如array-indexer )的序列中选择特定项目的功能。当然,“序列”是一个来自表值函数()的表。 那么如何在索引不可用时创建索引呢?这是查询: 按字母顺序排序,但实际上我想按(不可用)索引排序。 请注意,这个问题是我对这个问题的回答引起的。 问题答案: 当然,您只需要跟踪每个项目在列表中的显示位置即可。一种方法是让您的拆分函数插入一列。以

  • 问题内容: 我正在尝试通过搜索找到一个。有人知道该怎么做吗? 我看到了,但是我想要类似python的东西。 问题答案: 由于Swift在某些方面要比面向对象的功能更强大(并且Array是结构而不是对象),因此请使用“ find”函数对数组进行操作,该数组将返回可选值,因此请准备处理nil值: Swift 2.0更新: Swift 2.0不再支持旧功能! 使用Swift 2.0,可以使用扩展中定义的

  • 本文向大家介绍程序在C ++中找到系列1、3、12、60、360 ...的第N个项,包括了程序在C ++中找到系列1、3、12、60、360 ...的第N个项的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将讨论一个程序来查找系列1、3、12、60、360的N个项。 为此,我们将提供一个号码。我们的任务是在特定位置找到给定系列的术语。 示例 输出结果

  • 问题内容: 如果要尝试在列表中查找某项的索引,则可以采用几种不同的方法来完成,这就是我所知道的最快的方法 另一种方式不是pythonic且速度较慢 第一种方法无疑是更快的方法,但是如果您想更快地进行操作,那该怎么办呢?对于第一个索引使用方法 速度很快,但无法处理多个索引如何加快速度? 问题答案: 假设您想要一个列表作为输出:对于我的测试,所有选项似乎都表现出相似的时间性能,列表理解最快(几乎没有)

  • 问题内容: 我正在尝试使用Java 8流和lambda表达式进行顺序搜索。这是我的代码 我知道总是打印第一次出现的索引。如何打印所有索引? 问题答案: 首先,使用Lambdas并不是解决所有问题的方法…但是,即使如此,作为for循环,您也可以编写它: 现在,这没有什么特别的错误,但是请注意,这里的关键方面是索引,而不是值。索引是“循环”的输入和输出。 作为流: 产生输出:

  • 本文向大家介绍sharepoint项目。从列表中检索项目,包括了sharepoint项目。从列表中检索项目的使用技巧和注意事项,需要的朋友参考一下 示例