4

我有二维列表,我需要搜索元素的索引。当我开始编程时,我使用了以下功能:

def in_list(c):
    for i in xrange(0,no_classes):
        if c in classes[i]:
            return i;

    return -1

这里的类是一个二维列表,no_classes 表示类的数量,即列表的第一个维度。当 c 不在数组中时返回 -1。有什么我可以优化搜索的吗?

4

4 回答 4

4

你不需要定义no_classes自己。使用enumerate()

def in_list(c, classes):
    for i, sublist in enumerate(classes):
        if c in sublist:
            return i
    return -1
于 2013-08-04T09:43:28.753 回答
1

使用 list.index(item)

a = [[1,2],[3,4,5]]

def in_list(item,L):
    for i in L:
        if item in i:
            return L.index(i)
    return -1

print in_list(3,a)
# prints 1
于 2013-08-04T09:42:19.607 回答
1

如果顺序无关紧要并且您的数据中没有重复项,我建议您将 2D 列表转换为集合列表:

>>> l = [[1, 2, 4], [6, 7, 8], [9, 5, 10]]
>>> l = [set(x) for x in l]
>>> l
[set([1, 2, 4]), set([8, 6, 7]), set([9, 10, 5])]

之后,您的原始函数将运行得更快,因为在集合中搜索元素是恒定的(而在列表中搜索元素是线性的),所以您的算法变为 O(N) 而不是 O(N^2)。

请注意,您不应在函数中执行此操作,否则每次调用函数时都会对其进行转换。

于 2013-08-04T10:18:06.260 回答
0

如果您的“2D”列表是矩形的(每行的列数相同),您应该将其转换为 anumpy.ndarray并使用 numpy 功能进行搜索:

a = np.array(c)
i,j = np.where(a==element)

i并将j分别包含行和列索引。

例子:

a = np.array([[1,2],
              [3,4],
              [2,6]])
i,j = np.where(a==2)
print i
#array([0, 2])
print j
#array([1, 0]))
于 2013-08-04T10:53:46.977 回答