【问题标题】:Search in 2D list using python to find x,y position使用 python 在二维列表中搜索以查找 x,y 位置
【发布时间】:2013-08-05 04:23:08
【问题描述】:

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

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

    return -1

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

【问题讨论】:

  • 如果您将使用适当的数据结构(如 set),或者如果您事先对列表进行排序,则可以对其进行优化,否则它是 O(N^2) 算法,您无法更快地完成
  • @Roman Park:你能提供一些关于优化这个的提示吗?
  • 您的列表中有重复项吗?元素的顺序重要吗?
  • 没有重复...而且顺序真的不重要
  • 这是个好问题,但我认为在代码审查堆栈交换中会更好。

标签: python list search python-2.7


【解决方案1】:

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

def in_list(c, classes):
    for i, sublist in enumerate(classes):
        if c in sublist:
            return i
    return -1

【讨论】:

  • 同一个元素多次出现如何处理?
  • 想通了,只要遇到第一次就不用返回了
【解决方案2】:

使用 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

【讨论】:

  • 你应该添加 try 除非你想使用索引 - 请参阅文档 - Return the index in the list of the first item whose value is x. It is an error if there is no such item. docs.python.org/2/tutorial/datastructures.html
  • 这里不可能有错误,因为 i 肯定在列表中,因为它是我们迭代的列表的一部分。除了这里,无需尝试。
  • 哎呀,没看到,请以某种方式编辑答案,以便我可以取消我的 -1
  • 没问题,你可以简单地再次按下错误,这应该撤消downvote。
  • 在一定时间后不能取消投票:(除非答案被编辑
【解决方案3】:

如果顺序无关紧要并且您的数据中没有重复项,我建议您将 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)。

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

【讨论】:

    【解决方案4】:

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

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

    ij 将分别包含行和列索引。

    例子:

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

    【讨论】:

      猜你喜欢
      • 2017-04-03
      • 1970-01-01
      • 2017-06-21
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多