0

我正在尝试一些不同的方法来运行一些 for...in 循环。考虑一个列表列表:

list_of_lists = []
list = [1, 2, 3, 4, 5]
for i in range(len(list)):
    list_of_lists.append(list) # each entry in l_o_l will now be list

现在假设我想让 l_o_l 的第一个“列”包含在一个单独的列表中,a. 我有几种方法可以解决这个问题。例如:

a = [list[0] for list in list_of_lists] # this works (a = [1, 1, 1, 1, 1])

或者

a=[]
for list in list_of_lists:
    a.append(hit[0]) #this also works

但是,对于第二个示例,我认为“完整”扩展等效于

a=[]
a.append(list[0] for list in list_of_lists) #but this, obviously, produces a generator error

实际上,有效的“翻译”是

a=[]
a.append([list[0] for list in list_of_lists]) #this works

那么,我的问题是关于解释和标点符号。Python如何“知道”附加/确实在“list [0] for list in list_of_lists”扩展中附加列表括号(因此在任何重写中都需要它)?

4

2 回答 2

3

这里的问题是列表推导和生成器表达式不仅仅是循环,它们还不止于此。

正如您所展示的,列表推导式旨在成为一种从可迭代对象构建列表的简单方法。

您的后两个示例都不起作用-在这两种情况下,您都将错误的东西附加到列表中-在第一种情况下,生成器,第二种情况在现有列表中附加了一个列表。这些都不是你想要的。

你试图同时以两种不同的方式做某事,但它不起作用。只需使用列表理解 - 它以最有效和可读的方式完成您想做的事情。

您的主要问题是您似乎采用了列表推导和生成器表达式,却不了解它们是什么以及它们要做什么。我建议您在使用它们之前尝试进一步了解它们。

于 2012-05-25T20:08:06.203 回答
1

那么,我的问题是关于解释和标点符号。Python如何“知道”附加/确实在“hit [0] for list in list_of_lists”扩展周围附加列表括号(因此在任何重写中都需要它)?

不知道那应该是什么意思。我想你可能没有意识到除了列表推导之外[i*2 for i in range(0,3)]还有生成器表达式(i*2 for i in range(0,3))

生成器表达式是一种用于创建执行映射的生成器的语法,就像列表推导式(但作为生成器)。任何列表推导都可以重写。之所以有一个赤裸裸的内部是因为生成器表达式作为调用的参数出现的地方,允许去掉括号。这就是您在.[c]list(c)clist()a.append(hit[0] for list in list_of_lists)

于 2012-05-25T20:10:29.890 回答