[英]Search in 2D list using python to find x,y position
我有二维列表,我需要搜索元素的索引。 当我开始编程时,我使用了以下功能:
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”列表是矩形的(每行的列数相同),您应该将其转换为numpy.ndarray
并使用 numpy 功能进行搜索。 对于整数数组,可以使用==
进行比较。 对于浮点数数组,您应该使用np.isclose
代替:
a = np.array(c, dtype=int)
i,j = np.where(a == element)
或者
a = np.array(c, dtype=float)
i,j = np.where(np.isclose(a, element))
这样i
和j
分别包含行和列索引。
例子:
a = np.array([[1, 2],
[3, 4],
[2, 6]], dtype=float)
i, j = np.where(np.isclose(a, 2))
print(i)
#array([0, 2])
print(j)
#array([1, 0]))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.