【问题标题】:Python: Return 2 ints for index in 2D lists given itemPython:为给定项目的二维列表中的索引返回 2 个整数
【发布时间】:2011-04-25 05:05:37
【问题描述】:

这周我一直在修补 python,但遇到了一些问题。
如果我有这样的二维列表:

myList = [[1,2],[3,4],[5,6]]

我做到了

>>>myList.index([3,4])

它会返回

1

但是,我想要列表之一中某些内容的索引,就像这样

    >>>myList.index(3)

它会返回

1, 0

有什么可以做到这一点吗?

干杯

【问题讨论】:

  • 首先myList.index(3) 是如何返回1,0 的? (你应该只访问这样的内容吗myList[3]?)
  • 不是,我正在寻找的方法会返回。

标签: python nested-lists


【解决方案1】:

试试这个:

def index_2d(myList, v):
    for i, x in enumerate(myList):
        if v in x:
            return (i, x.index(v))

用法:

>>> index_2d(myList, 3)
(1, 0)

【讨论】:

    【解决方案2】:

    如果您要进行多次查找,您可以创建一个映射。

    >>> myList = [[1,2],[3,4],[5,6]]
    >>> d = dict( (j,(x, y)) for x, i in enumerate(myList) for y, j in enumerate(i) )
    >>> d
    {1: (0, 0), 2: (0, 1), 3: (1, 0), 4: (1, 1), 5: (2, 0), 6: (2, 1)}
    >>> d[3]
    (1, 0)
    

    【讨论】:

      【解决方案3】:

      使用简单的genexpr:

      def index2d(list2d, value):
          return next((i, j) for i, lst in enumerate(list2d) 
                      for j, x in enumerate(lst) if x == value)
      

      示例

      print index2d([[1,2],[3,4],[5,6]], 3)
      # -> (1, 0)
      

      【讨论】:

        【解决方案4】:

        没有什么可以做到这一点,除非它是在 numpy 中,我不太了解。这意味着您必须编写执行此操作的代码。这意味着诸如“[[1, 2], [2, 3], [3, 4]].index(3) 返回什么?”之类的问题。很重要。

        【讨论】:

          【解决方案5】:
          def td(l,tgt):
              rtr=[]
              for sub in l:
                  if tgt in sub:
                      rtr.append(    (l.index(sub),sub.index(tgt))    )
          
              return rtr        
          
          
          myList = [[1,2],[3,4],[5,6]]
          
          print td(myList,3)
          

          这将返回多个子列表的实例,如果有的话。

          【讨论】:

            【解决方案6】:

            试试这个!这对我有用:)

            def ret_pos(mylist,val_to_find):
                for i in (len(mylist)):
                    for j in (len(i)):
                        if mylist[i][j]== val_to_find:
                            postn=[i,j]
                return(postn);
            

            【讨论】:

            【解决方案7】:

            基于kevpie's answer,我设法获得了一个包含所有事件坐标的二维列表

            myList = [[0,1],[1,1],[0,0],[1,0]]
            coordsList = [[x, y] for x, li in enumerate(myList) for y, val in enumerate(li) if val==1]
            

            现在 coordsList 包含 myList 中值 1 的所有索引:

            [[0, 1], [1, 0], [1, 1], [3, 0]]
            

            【讨论】:

              【解决方案8】:

              注意: 上面的第一个答案:

              def index_2d(myList, v):
                  for i, x in enumerate(myList):
                      if v in x:
                          return (i, x.index(v))
              

              只要有任何相等/相同的元素,对于每个 x 中的任何 v,都会导致很多 错误。因为 x.index(v) 只返回在 x 中具有相同 v 值的任何元素的第一个(最左边)索引,而不是当前 v 的实际索引。也就是说,这仅适用于每行中的所有元素是独一无二的。

              请尝试这样做以避免非唯一值:

              import numpy
              arr_2D = numpy.array(...)
                                
              for x, row in enumerate(arr_2D.tolist()):
                  for y, cell in enumerate(row):
                  cell_pos = (x, y)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-05-15
                • 1970-01-01
                • 2014-06-27
                • 1970-01-01
                • 1970-01-01
                • 2017-08-16
                • 1970-01-01
                • 2023-03-26
                相关资源
                最近更新 更多