Python - 有效地查找列表中的元素

时间:2011-06-27 11:55:04

标签: python

我有一个列表list_a,其中包含浮动数字:

list_a = [[[ 0 for i in range(40)] for j in range(1000)]for k in range(47)]

我有一个排序版本:

list_a_sorted = list_a
list_a_sorted[0].sort()

因此list_a_sorted已排序并包含list_a的值,从最低的第一个开始。我们假设它如下:

[2.3,3.1.........9]

所以2.3是最低值,但我怎么能知道这是list_a中的第8个元素还是15或n?

由于我的名单很大,我还需要尽可能高效地完成这项工作吗?任何帮助将不胜感激,谢谢

4 个答案:

答案 0 :(得分:5)

要查找列表中元素的位置,可以使用l.index(something)

http://docs.python.org/library/stdtypes.html#typesseq

答案 1 :(得分:3)

如果速度至关重要(并且您有类似"创建一次,经常查找"如果您没有任何重复条目(如果您使用set)那么我建议您在创建列表时创建一个字典,每个项目都作为键,并且它的索引为值。在这种情况下,无论长度如何,您都将始终具有O(1)查找时间字典。许多 ifs 那里......

答案 2 :(得分:3)

如果您想在未排序列表中找到n最小值,请查看heapq.nsmallest(),如果n不是太大,则可能效率更高。要找到最小值的位置,请尝试:

>>> from heapq import nsmallest
>>> from random import random
>>> values = [random() for i in range(20)]
>>> values
[0.012227103410989537, 0.9782624648209769, 0.9896111545377924, 0.9033620518745159, 0.6767780103989406, 0.4595455061820246, 0.39814471642551696, 0.6904798136040561, 0.8727083752258934, 0.6680153337266017, 0.606044647078923, 0.5644656135679249, 0.934351848916147, 0.05955628567745763, 0.7236000566917332, 0.8303865367817055, 0.9671576336593124, 0.3164892315873573, 0.8416372881413415, 0.5009057933309073]
>>> nsmallest(4, range(len(values)), key=lambda i: values[i])
[0, 13, 17, 6]

或更快但稍微不那么明确:

>>> nsmallest(4, range(len(values)), key=values.__getitem__)
[0, 13, 17, 6]

对于您的列表,您可能需要类似(未经测试的代码):

def indices():
    for k in range(47):
        for j in range(1000):
            for i in range(40):
                yield k, j, i
def keyfn(ind):
    k, j, i = ind
    return list_a[k][j][i]

print(nsmallest(4, indices(), key=keyfn))

答案 3 :(得分:1)

在评论中回答问题......

如果L是数字列表,则会返回n个最小项目的标记

[j for i,j in sorted((j,i) for i,j in enumerate(L))[:n]]

这是另一种更棘手的方式

sorted(range(len(L)), key=L.__getitem__)[:n]

哪个更有效率留给读者练习:)