列表推导和矩阵(原始)

时间:2012-09-27 07:00:48

标签: python-3.x

请看一下这个限制:

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

T = [row[1] for row in M]
print(T)

结果是[2,5,8]

我设法在这里找到了一些东西: http://docs.python.org/py3k/tutorial/datastructures.html#nested-list-comprehensions

但是我对'raw'对这个方案的理解并不满意。 你能告诉我文件中的哪些地方我能读到它吗?

顺便问一下,为什么生吃?它似乎是一个专栏?

2 个答案:

答案 0 :(得分:2)

T = [row[1] for row in M]

这是list comprehension。列表推导基本上允许您在迭代其他迭代时动态创建列表(在本例中为M)。

上面的代码或多或少与此相同:

T = []             # create empty list that holds the result
for row in M:      # iterate through all 'rows' in M
    cell = row[1]  # get the second cell of the current row
    T.append(cell) # append the cell to the list

这些只是组合成一行而且效率更高,但基本思路是一样的。

M是一个矩阵,但您选择的内部表示是一个列表列表;或的列表。在T中,您希望选择矩阵的单个,尽管您无法直接访问矩阵T中的列。因此,您基本上会浏览每个,获取您感兴趣的列的单元格,并使用列的单元格创建一个新列表(因为列表通常是水平对齐的,所以您严格要进行转置你的专栏的矢量。)

答案 1 :(得分:0)

您遍历行并获取行的第二个元素。然后从行中收集提取的元素。这意味着您已经提取了该列。

从右到左阅读列表理解。它说:

  • 遍历矩阵M,每次都获得rowfor row in M)。
  • 将表达式应用于row以获得所需内容(此处为row[1])。
  • 迭代构建的结果并构建它们的列表([ ... ])。

最后一点使它成为 list 理解。 []之间的内容称为生成器表达式。您也可以尝试:

column = list(row[1] for row in M)

你得到的完全相同。这是因为list()构造了任何可迭代的列表。并且生成器表达式是可迭代的东西。您也可以尝试:

my_set = set(row[1] for row in M)

获取构成列的元素集。语法简短形式是:

my_set = {row[1] for row in M} 

它被称为 set comprehension 。并且还可以有这样的字典理解

d = { row[1]: True for row in M }

在人工方面,row[1]用作关键字,True用作值。