在Python中,如何获取包含多个列表的列表的索引?

3

Input:

List of lists : x[x2[x1]]

matrix = [['.', '+', '.', '.', '-'], 
          ['.', '+', '.', '-', '-'], 
          ['.', '+', '.', '.', '-'], 
          ['.', '+', '.', '.', '-']]

这是输入x[x2[x1]]的二维表示(注意:这不是所需的输出)

x1-> 0 1 2 3 4   
  0  . + . . -
  1  . + . - - 
  2  . + . . -
  3  . + . . -
 x2^

预期输出:

  • "Raster" ordering of instances of '+'s and '-'s
  • Output format : (x1,x2,symbol)

    examples = [(1,0,+), (4,0,-), (1,1,+), (3,1,-), (4,1,-), (1,2,+), (4,1,-), (1,3,+)]
    

我的工作:

技术 1:

examples = []
    for a in matrix:
        for b in a:
            if(matrix[a][b] == '+' || matrix[a][b] == '-' ):
                examples.append()

技巧2:(利用enumerate()函数)

list(enumerate(matrix[num]) for num in matrix) 

第二种技术会产生以下错误 -
TypeError: list indices must be integers, not list
3个回答

3
In [7]: [ (i,j,character) for i, character in enumerate(row) for j, row in enumerate(matrix)  if character == '+' or character == '-']
Out[7]:
[(1, 0, '+'),
 (1, 1, '+'),
 (1, 2, '+'),
 (1, 3, '+'),
 (4, 0, '-'),
 (4, 1, '-'),
 (4, 2, '-'),
 (4, 3, '-')]

如果之前的问题让您感到困惑,我很抱歉,请查看更新后的问题。期望的输出是一个元组列表 - examples = [(1,0,+), (4,0,-), (1,1,+), (3,1,-), (4,1,-), (1,2,+), (4,1,-), (1,3,+)] - Ketcomp
输出按照那个顺序是因为 if character == '+' 先出现,会首先遍历列表并列出所有的加号实例。 - Ketcomp

2

我不确定这是否是您想要的,但这是我的代码:

matrix = [['.', '+', '.', '.', '-'], ['.', '+', '.', '-', '-'], ['.', '+', '.', '.', '-'], ['.', '+', '.', '.', '-']]

lst = []
for lineIdx, line in enumerate(matrix) :
    for colIdx, col in enumerate(line) :
        if matrix[lineIdx][colIdx] in ['+', '-'] :
            lst.append((lineIdx, colIdx, matrix[lineIdx][colIdx]))
print lst

并输出:

[(0, 1, '+'), (0, 4, '-'), (1, 1, '+'), (1, 3, '-'), (1, 4, '-'), 
(2, 1, '+'), (2, 4, '-'), (3, 1, '+'), (3, 4, '-')]

在我的列表中,我保存了第一行索引,然后是列索引。

在“for lineIdx,line”这一行中,lineIdx和line是相同的值吗?我的问题是,我们是否给列表'matrix'中的元素数量不同的名称,即“lineIdx”和“line”? - Ketcomp
1
不,请看一下enumerate()函数。这里有一个小例子:a = [10, 20, 30];for idx, elem in enumerate(a) : print idx, elem。idx是列表索引(以零为基准),elem是实际的列表元素。在我们的例子中,lineIdx是列表的以零为基准的索引(即行索引),而line是一个列表(即原始数据)。 - Mihai Hangiu

1
在第二种技术中,num 不是整数,而是 x 的某个元素。
你可以像这样在一行中完成它:
>>>inp = [['.', '+', '.', '.', '-'], ['.', '+', '.', '-', '-'], ['.', '+', '.', '.', '-'], ['.', '+', '.', '.', '-']]
>>>[ (y[0], x[0], y[1]) for x in (enumerate(inp)) for y in enumerate(x[1]) if y[1] !='.']

[(1, 0, '+'), (4, 0, '-'), (1, 1, '+'), (3, 1, '-'), (4, 1, '-'), (1, 2, '+'), (4, 2, '-'), (1, 3, '+'), (4, 3, '-')]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接