1

我可以读取矩阵的第 n 个字母的最简单方法是什么?

我认为这可以通过一个简单的 for 循环来实现,但到目前为止我还没有运气。到目前为止,我能做的最好的事情是使用一个不太优雅的计数:

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

count = 0
for n in matrix:
     print matrix[count][nth]
     count += 1

例如:读取每行的第 0 个数字:1、2、1。读取每行的第 4 个数字:6、2、8。

4

9 回答 9

3

如果您需要大量执行此操作,您可以使用转置矩阵zip(*matrix)

>>> matrix = [[1, 3, 5, 2, 6, 2, 4, 1], [2, 6, 1, 6, 2, 5, 7], [1, 6, 2, 6, 8, 2, 6]]
>>> matrix_t = zip(*matrix)
>>> matrix_t
[(1, 2, 1), (3, 6, 6), (5, 1, 2), (2, 6, 6), (6, 2, 8), (2, 5, 2), (4, 7, 6)]
>>> matrix_t[0]
(1, 2, 1)
>>> matrix_t[3]
(2, 6, 6)
于 2013-11-04T02:23:26.247 回答
2

这里有一些东西可以处理不同长度的行(如您的示例),以及支持 Python 对相对于序列末尾的负索引的特殊解释(通过将它们更改为len(s) + n):

NULL = type('NULL', (object,), {'__repr__': lambda self: '<NULL>'})()

def nth_elems(n):
    abs_n = abs(n)
    return [row[n] if abs_n < len(row) else NULL for row in matrix]

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

print nth_elems(0)   # [1, 2, 1]
print nth_elems(6)   # [4, 7, 6]
print nth_elems(7)   # [1, <NULL>, <NULL>]
print nth_elems(-1)  # [1, 7, 6]
于 2013-11-04T03:14:29.537 回答
1

Python 中的列表不适合这样使用。如果数据足够大,使用列表推导可能会导致内存和 CPU 问题。如果这是一个问题,请考虑使用numpy 。

于 2013-11-04T02:46:03.740 回答
1
In [1]: matrix = [[1, 3, 5, 2, 6, 2, 4, 1], [2, 6, 1, 6, 2, 5, 7], [1, 6, 2, 6, 8, 2, 6]]

In [2]: nth=0

In [3]: [row[nth] for row in matrix]
Out[3]: [1, 2, 1]

In [4]: nth=4

In [5]: [row[nth] for row in matrix]
Out[5]: [6, 2, 8]
于 2013-11-04T02:18:13.683 回答
1

也许这样?

column = [row[0] for row in matrix]

(对于第 0 个元素)

于 2013-11-04T02:18:18.187 回答
1

这是使用列表理解的解决方案:

[x[0] for x in matrix]

这基本上等于:

for x in matrix:
    print x[0]

你也可以让它成为一个函数:

def getColumn(lst, col):
    return [i[col] for i in lst]

演示:

>>> matrix = [[1, 3, 5, 2, 6, 2, 4, 1], [2, 6, 1, 6, 2, 5, 7], [1, 6, 2, 6, 8, 2, 6]]
>>> def getColumn(lst, col):
    return [i[col] for i in lst]

>>> getColumn(matrix, 0)
[1, 2, 1]
>>> getColumn(matrix, 5)
[2, 5, 2]

希望这可以帮助!

于 2013-11-04T02:18:37.237 回答
1

列表推导在这里可以很好地工作:

>>> matrix = [[1, 3, 5, 2, 6, 2, 4, 1], [2, 6, 1, 6, 2, 5, 7], [1, 6, 2, 6, 8, 2, 6]]
>>> # Get all the 0th indexes
>>> a = [item[0] for item in matrix]
>>> a
[1, 2, 1]
>>> # Get all the 4th indexes
>>> b = [item[4] for item in matrix]
>>> b
[6, 2, 8]
>>>
于 2013-11-04T02:19:00.080 回答
1

您的 for 循环可能没有达到您的预期。n 不是整数。它是当前行。我想你想做的是:

for row in matrix:
    print row[0], row[4]

这打印,

1 6
2 2
1 8

另外,严格来说,矩阵是列表的列表。要真正拥有一个矩阵,您可能需要使用 numpy.

于 2013-11-04T02:24:09.817 回答
1

使用邮编:

>>> matrix = [[1, 3, 5, 2, 6, 2, 4, 1], [2, 6, 1, 6, 2, 5, 7], [1, 6, 2, 6, 8, 2, 6]]
>>> zip(*matrix)[0]
(1, 2, 1)
>>> zip(*matrix)[4]
(6, 2, 8)
于 2013-11-04T04:47:46.047 回答