我有二维列表,我需要搜索元素的索引。当我开始编程时,我使用了以下功能:
def in_list(c):
for i in xrange(0,no_classes):
if c in classes[i]:
return i;
return -1
这里的类是一个二维列表,no_classes 表示类的数量,即列表的第一个维度。当 c 不在数组中时返回 -1。有什么我可以优化搜索的吗?
我有二维列表,我需要搜索元素的索引。当我开始编程时,我使用了以下功能:
def in_list(c):
for i in xrange(0,no_classes):
if c in classes[i]:
return i;
return -1
这里的类是一个二维列表,no_classes 表示类的数量,即列表的第一个维度。当 c 不在数组中时返回 -1。有什么我可以优化搜索的吗?
你不需要定义no_classes
自己。使用enumerate()
:
def in_list(c, classes):
for i, sublist in enumerate(classes):
if c in sublist:
return i
return -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
如果顺序无关紧要并且您的数据中没有重复项,我建议您将 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)。
请注意,您不应在函数中执行此操作,否则每次调用函数时都会对其进行转换。
如果您的“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]))