2024-05-23 22:43:59 发布
网友
如何返回iterable的第n个最大项的原始列表中的索引
heapq.nlargest(2, [100, 2, 400, 500, 400]) output = [(3,500), (2, 400)]
这已经花了我几个小时。我想不通。
>>> seq = [100, 2, 400, 500, 400] >>> heapq.nlargest(2, enumerate(seq), key=lambda x: x[1]) [(3, 500), (2, 400)]
您可以将^{}与^{}结合使用,这对于小的n来说很快(注意list.index返回值为x的第一个项列表中的索引):
n
list.index
>>> iterable = [100, 2, 400, 500, 400] >>> map(iterable.index, heapq.nlargest(2, iterable)) [3, 2]
要查看关联的值。。。
>>> map(lambda n: (n, iterable.index(n)), heapq.nlargest(2, iterable)) [(500, 3), (400, 2)]
有关更大的n请参阅@silenghost的帖子。
编辑:对一些解决方案进行基准测试:
#!/usr/bin/env python import heapq from timeit import Timer seq = [100, 2, 400, 500, 400] def a(seq): """returns [(3, 500), (2, 400)]""" return heapq.nlargest(2, enumerate(seq), key=lambda x: x[1]) def b(seq): """returns [3, 2]""" return map(seq.index, heapq.nlargest(2, seq)) def c(seq): """returns [(500, 3), (400, 2)]""" map(lambda n: (n, seq.index(n)), heapq.nlargest(2, seq)) if __name__ == '__main__': _a = Timer("a(seq)", "from __main__ import a, seq") _b = Timer("b(seq)", "from __main__ import b, seq") _c = Timer("c(seq)", "from __main__ import c, seq") loops = 1000000 print _a.timeit(number=loops) print _b.timeit(number=loops) print _c.timeit(number=loops) # Core i5, 2.4GHz, Python 2.6, Darwin # 8.92712688446 # 5.64332985878 # 6.50824809074
您可以将^{} 与^{} 结合使用,这对于小的
n
来说很快(注意list.index
返回值为x的第一个项列表中的索引):要查看关联的值。。。
有关更大的
n
请参阅@silenghost的帖子。编辑:对一些解决方案进行基准测试:
相关问题 更多 >
编程相关推荐