繁体   English   中英

使用 python 在二维列表中搜索以查找 x,y 位置

[英]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))

这样ij分别包含行和列索引。

例子:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM