请看一下这个限制:
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'对这个方案的理解并不满意。 你能告诉我文件中的哪些地方我能读到它吗?
顺便问一下,为什么生吃?它似乎是一个专栏?
答案 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
,每次都获得row
(for 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
用作值。