我想在列表中找到第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中也有类似上述情况的解决方案,例如,使用cumsum
和where
,但是我想知道是否有无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项目。从列表中检索项目的使用技巧和注意事项,需要的朋友参考一下 示例