在多维列表上使用index()

时间:2011-06-29 09:18:07

标签: python

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

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

2维或n维列表的等价物是什么?

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

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

现在假设我要在此列表中标识某个值。如果我知道第一和第二个维度的索引但不知道我想要的值的第零个索引,我该如何找到第零个索引?

会是这样的:

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

输出为整数:     0

9 个答案:

答案 0 :(得分:13)

我不知道自动方式,但是如果

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)

答案 1 :(得分:7)

二维列表;你可以遍历行并使用.index函数来查找项目:

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:3)

对于多维数组:

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块,但我找不到一个: In Python, how do I determine if an object is iterable?

答案 4 :(得分:0)

对于n维递归搜索,您可以尝试这样的事情:

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

结果是:

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

可能有更好的方法可以做到这一点,但这是我在没有任何图书馆的情况下想出来的。

编辑: 实际上,它并不完美,必须添加一个库。这是副本。现在没关系。

答案 5 :(得分:0)

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

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)

或者所有事件(确保代码可以优化 - 修改为与生成器一起使用等等 - 但这只是一个示例):

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)

答案 6 :(得分:0)

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

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

或者如果你知道该项目有多个匹配项,那么你可以这样做:

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

这些都不会引发任何错误但只有在没有子阵列时它们才会起作用。有关过滤器功能的信息,请转到here

答案 7 :(得分:0)

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]

答案 8 :(得分:0)

list1 = [10, 20, [300, 400, [5000, 6000, [1, 6000, 2]], 6000, 500], 30, 40]

print(f'Your list is {list1}')
print('---------------------------------------------------------')

index = []


index_result=['6000 index is list1']

def try_this(list1, index):
    for x, element in enumerate(list1):
        if element == 6000:
           index.append(x)
           index_result.append(index[:])
           index.pop()
        elif type(element) == list:
           index.append(x)
           try_this(element, index)
           index.pop()


print(try_this(list1, index))
print(index_result)