关于python:在多维列表上使用index()

using index() on multidimensional lists

对于一维列表,项的索引如下:

1
2
 a_list = ['a', 'b', 'new', 'mpilgrim', 'new']
 a_list.index('mpilgrim')

2维或n维列表的等效值是多少?

编辑:我添加了一个示例来澄清:如果我有如下三维列表

1
2
3
4
5
6
7
8
9
10
11
12
b_list = [
          [1,2],
          [3,4],
          [5,6],
          [7,8]
         ],
         [
          [5,2],
          [3,7],
          [6,6],
          [7,9]
         ]

现在假设我想在这个列表中标识一个特定的值。如果我知道第1和第2维度的索引,但不知道我想要的值的第0个索引,那么如何找到第0个索引呢?

会不会是这样的:

1
2
  target_value = 7
  b_list[0].index(target_value)

输出为整数时:零


我不知道一种自动的方法,但是如果

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

如果你想找到3的位置,你可以这样做:

x = [x for x in a if 3 in x][0]

print 'The index is (%d,%d)'%(a.index(x),x.index(3))

输出是:

The index is (1,0)


对于二维列表,可以遍历行并使用.index函数查找项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def find(l, elem):
    for row, i in enumerate(l):
        try:
            column = i.index(elem)
        except ValueError:
            continue
        return row, column
    return -1

tl = [[1,2,3],[4,5,6],[7,8,9]]

print(find(tl, 6)) # (1,2)
print(find(tl, 1)) # (0,0)
print(find(tl, 9)) # (2,2)
print(find(tl, 12)) # -1


多维列表只是一个包含更多列表的列表。所以它的索引就是列表本身。

1
2
3
a = [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
print a.index([2, 3, 4])
# prints 1

对于多维数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def find(needle,haystack):
  if needle == haystack: return []
  # Strings are iterable, too
  if isinstance(haystack,str) and len(haystack)<=1: return None
  try:
    for i,e in enumerate(haystack):
      r = find(needle,e)
      if r is not None:
        r.insert(0,i)
        return r
  except TypeError:
    pass
  return None    


ml = [[1,2,3],[4,5,6],[7,8,9]]
print find(2,ml)
ml = [3,[[1,2,3],[4,5,6],[7,8,9]]]
print find(2,ml)
ml = [[["ab","bc","cde"]]]
print find("d",ml)

应该有更好的方法来避免try/except块,但我找不到:在Python中,如何确定一个对象是否是不可访问的?


1
2
3
4
5
6
7
list_2d = [[1,2],[3,4],[5,6]]

element = 1

index_row = [list_2d.index(row) for row in list_2d if element in row]

index_column = [row.index(element) for row in list_2d if element in row]

如果要查找包含项的列表,最简单的方法是:

1
2
i = 4
index = b_list[0].index( filter(lambda 1D_list: i in index , b_list[0]) )

或者,如果您知道该项目有多个匹配项,则可以执行以下操作:

1
2
3
4
i = 4
indexes = []
for match in filter(lambda 1D_list: i in list, b_list[0]):
    indexes.append(b_list[0].index(match))

这些都不会引起任何错误,但只有在没有子数组的情况下才有效。有关筛选器功能的信息,请转到此处。


您也可以使用以下示例方法:

1
2
3
4
5
6
7
8
9
10
data = [[1, 1,2],[12,4],[6]]

def m_array_index(arr, searchItem):
    for i,x in enumerate(a):
        for j,y in enumerate(x):
            if y == searchItem:
                return i,j
    return -1,-1#not found

print m_array_index(data, 6)

或者所有出现的情况下(当然代码可以优化-可以修改为与生成器一起使用,等等-但这里只是一个示例):

1
2
3
4
5
occurrences = lambda arr, val: tuple((i,j) for i,x in enumerate(arr) for j,y in enumerate(x) if y == val) or ((-1,-1))

print occurrences(data, 1) # ((0, 0), (0, 1))
print occurrences(data, 12) # ((1, 0),)
print occurrences(data, 11) # (-1, -1)

对于N维递归搜索,可以尝试如下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from copy import copy
def scope(word, list, indexes = None):
    result = []
    if not indexes:
        indexes = []
    for index, item in enumerate(list):
        try:
            current_index = indexes + [index]
            result.append(current_index + [item.index(word)])
        except ValueError:
            pass

        if type(item[0]) == type([]):
            indexes.append(index)
            result.extend(scope(word, item, copy(indexes)))

    return result

结果是:

1
2
3
4
>>> d_list = [['a', 'b', 'new', 'mpilgrim', 'new'], [['a', 'b', 'new', 'mpilgrim', 'new'], ['b', 'd', 'new', 'mpilgrim', 'new']]]
>>> word = 'mpilgrim'
>>> result = scope(word, d_list)
[[0, 3], [1, 0, 3], [1, 1, 3]]

也许有更好的方法,但那是我在没有图书馆的情况下发现的。

编辑:实际上,它并不完美,必须添加一个库。这是复制品。现在可以了。