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) |
输出为整数时:零
我不知道一种自动的方法,但是如果
如果你想找到3的位置,你可以这样做:
输出是:
对于二维列表,可以遍历行并使用.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]] |
也许有更好的方法,但那是我在没有图书馆的情况下发现的。
编辑:实际上,它并不完美,必须添加一个库。这是复制品。现在可以了。