在嵌套列表中查找元素的索引

时间:2018-11-15 12:25:26

标签: python python-3.x python-2.7

我正在尝试创建一个程序,该程序将在嵌套列表中查找并存储每个元素的索引。

到目前为止,我已经尝试使用嵌套的迭代器来完成此操作。

下面是我的代码。

table = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
def coordinates(table):
    target_cell_list = []
    for row in table:
        for column in row:
            target_cell = (table.index(row), row.index(column))
            target_cell_list.append(target_cell)
    return target_cell_list

>>> table = [[1, 1, 1], [2, 2, 3], [2, 3, 3]]
>>> coordinates(table)
# current output
[(0, 0), (0, 0), (0, 0), (1, 0), (1, 0), (1, 2), (2, 0), (2, 1), (2, 1)]

# desired output
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

我认为行索引的输出方式正确,但列索引却做了一些奇怪的事情。

我已经看过几次代码了,但是我找不到它出了什么问题。

3 个答案:

答案 0 :(得分:4)

使用comprehension的嵌套enumerate可以做到:

table = [[1, 1, 1], [2, 2, 3], [2, 3, 3]]

def coordinates(tbl):
    return [(i, j) for i, row in enumerate(tbl) for j, _ in enumerate(row)]
    # or a little shorter
    # [(i, j) for i, row in enumerate(tbl) for j in range(len(row))]

coordinates(table)
# [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

您基于list.index(elmnt)的方法失败了,因为index始终返回列表中元素的 first 索引,因此,如果有重复,则该索引将无效。而且,由于每个index调用都必须迭代被调用的列表,因此它的性能也较差。 按照您的原始思路,基于纯循环索引的实现将是:

def coordinates(tbl):
    target_cell_list = []
    for i in range(len(tbl)):
        for j in range(len(tbl[i])):
            target_cell_list.append((i, j))
    return target_cell_list

如果您知道您的表不是jagged,则可以使用itertools.product

from itertools import product

def coordinates(tbl):
    return list(product(range(len(tbl)), range(len(tbl[0]))))

答案 1 :(得分:1)

这是一个numpy解决方案。

>>> import numpy as np
>>> list(zip(*np.where(np.ones_like(table))))                                                                     
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

答案 2 :(得分:0)

如果仔细观察,则可能会发现列表中存在重复的值,这是导致索引错误的原因。因此,如果出现重复,可以使用枚举。枚举将返回元组对象,以便对其进行迭代,这将为您提供预期的输出。

您可以试试这个-

def coordinates(table):
    target_cell_list = []
    for i,row in enumerate(table):
        for j in range(len(row)):
            target_cell = (i,j)
            target_cell_list.append(target_cell)
    return target_cell_list
table = [[1, 1, 1], [2, 2, 3], [2, 3, 3]]
print(coordinates(table))