获取包含值的第一个子列表的索引的最快方法

时间:2016-07-09 04:25:38

标签: python list multidimensional-array

我有一个表单列表

的python列表
A=[[1,2,3,4],
   [5,6,7,8],
   [9,10,11,12]]

我需要快速获取该结构中元素的行索引。

method(2) = 0

method(8) = 1

method(12) = 2

等等。和往常一样,方法越快越好,因为我的实际列表列表非常大。

4 个答案:

答案 0 :(得分:1)

在这种状态下,数据结构(列表列表)对于您要在其上进行的查询来说不是非常方便和有效。重组它以使其形式:

item -> list of sublist indexes  # assuming items can be present in multiple sublists

这样,按键 - O(1)即可立即查找。我们使用defaultdict(list)

>>> from collections import defaultdict
>>>
>>> d = defaultdict(list)
>>> for index, sublist in enumerate(A):
...     for item in sublist:
...         d[item].append(index)
... 
>>> d[2]
[0]
>>> d[8]
[1]
>>> d[12]
[2]

答案 1 :(得分:1)

使用带有生成器表达式的next()非常简单:

def method(lists, value):
    return next(i for i, v in enumerate(lists) if value in v)

问题在于如果value没有发生则会出错。使用稍长的函数调用,您可以将默认值设置为-1:

def method(lists, value):
    return next((i for i,v in enumerate(lists) if value in v), -1)

答案 2 :(得分:0)

这是另一种使用numpy

的方法
import numpy

A = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]

my_array = numpy.array(A)

numpy.where(my_array==2) ## will return both the list and the index within the list
numpy.where(my_array==12)

## As a follow up if we want only the index we can always do :
numpy.where(my_array==12)[0][0] # will return 2 , index of list
numpy.where(my_array==12)[1][0] # will return 3 , index within list

答案 3 :(得分:0)

查找列表中的操作是线性的。以下是python中的简单代码,用于在列表列表中查找元素。

A=[[1,2,3,4],
   [5,6,7,8],
   [9,10,11,12]]

def method(value):
    for idx, list in enumerate(A):
        if value in list:
            return idx
    return -1

print (method(12))