Python中文
首页
教程
问答
标签
搜索
登录
注册
查找lis中第n项的索引
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我想找到列表中第n个项目的索引。e、 g</p> <pre><code>x=[False,True,True,False,True,False,True,False,False,False,True,False,True] </code></pre> <p>第n个真的指数是多少?如果我想要第五次出现(第四次如果零索引),答案是10。</p> <p>我想到了:</p> <pre><code>indargs = [ i for i,a in enumerate(x) if a ] indargs[n] </code></pre> <p>请注意,<code>x.index</code>返回某个点之后的第一次出现或第一次出现,因此就我所知不是解决方案。</p> <p>在numpy中也有类似的解决方案,例如使用<code>cumsum</code>和<code>where</code>,但是我想知道是否有一种无numpy的方法来解决这个问题。</p> <p>我很担心性能,因为我第一次遇到这个问题是在为一个<a href="https://projecteuler.net" rel="noreferrer">Project Euler</a>问题实现一个Eratosthenes筛时,但这是我在其他情况下遇到的一个更一般的问题。</p> <p>编辑:我得到了很多很好的答案,所以我决定做一些性能测试。下面是以秒为单位的<code>timeit</code>执行时间,对于搜索第4000个/1000个真值的<code>len</code>元素的列表。列表是随机的真/假。下面链接的源代码;有点混乱。我使用海报名称的简短/修改版本来描述除了<code>listcomp</code>之外的功能,这是上面简单的列表理解。</p> <pre><code>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 </code></pre> <p>Hettinger的itertools解决方案几乎总是最好的。taymon和graddy的解决方案在大多数情况下都是次优的,不过当您希望第n个实例的n较高或出现次数少于n的列表时,列表理解方法可以更好地用于短数组。如果出现次数少于n次,则初始的<code>count</code>检查将节省时间。而且,graddy在搜索数字时比True/False更有效。。。不清楚原因。eyquem的解在本质上与其他解等价,开销略大或略小;eyquem_-occure与taymon的解大致相同,而eyquem_-occurrence与listcomp相似。</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>我不能肯定这是最快的方法,但我想这是很好的:</p> <pre><code>i = -1 for j in xrange(n): i = x.index(True, i + 1) </code></pre> <p>答案是<code>i</code>。</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
如何合并多个PDF文件?
8 回答
如何合并多个xarray数据变量及其坐标?
2 回答
如何合并多个列中具有重复值的行
4 回答
如何合并多个唯一id
3 回答
如何合并多个图纸并使用图纸名称的名称重命名列名?
9 回答
如何合并多个字典并添加同一个键的值?(Python)
6 回答
如何合并多个搜索结果文件(pkl)以将它们全部打印在一起?
9 回答
如何合并多个数据帧
9 回答
如何合并多个数据帧并使用Pandas为假人添加列?
4 回答
如何合并多个数据帧并按时间戳排序
4 回答
如何合并多个数据帧的列表并用另一个lis标记每列
1 回答
如何合并多个数据框中的列
1 回答
如何合并多个文件?
6 回答
如何合并多个查询集?
3 回答
如何合并多个绘图?
9 回答
如何合并多个词典
2 回答
如何合并多个输入数据集(数据帧)?
4 回答
如何合并多条记录中拆分的文本行
10 回答
如何合并多索引列datafram
5 回答
如何合并多级(即多索引)数据帧?
4 回答