0

请看一下这个收缩:

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

但我不满意我对这个“原始”方案的理解。你能告诉我在文档中的其他地方我可以阅读它吗?

顺便说一句,为什么是生的?好像是柱子?

4

2 回答 2

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

这是一个列表理解。列表推导基本上允许您在迭代其他可迭代对象时动态创建列表(在本例中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

于 2012-09-27T10:20:53.710 回答
0

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

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

  • 循环遍历矩阵M以获得row每次 ( for row in M)。
  • 将表达式应用于row以获得您需要的内容(此处row[1])。
  • 遍历构造的结果并构建它们的列表 ( [... ])。

最后一点使它成为列表理解。[和之间的东西]称为生成器表达式。你也可以试试:

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} 

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

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

这里相当人为地,将row[1]用作键,将True用作值。

于 2012-09-27T10:11:10.950 回答