2012-05-25 47 views
0

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

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]) 

OR

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_of_lists扩展列表的“list [0]”附近添加了列表括号(并因此需要在任何重写中)?

+1

你从不在任何地方定义'hit'。 – agf

+8

永远不要调用列表'list'。它会影响名为'list'的内建程序并导致问题。 – murgatroid99

+0

“完全扩展”是什么意思?你的第三个例子不等于你的前两个。相反,这是(语义上)等价的:'a.extend(l [0] for list_of_lists)'(假设'list'和'hit'打算是相同的变量) –

回答

3

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

List comprehensions被设计成从一个迭代建立一个列表中的一个简单的方法,因为你表现出来了。

你的后两个例子中都没有工作 - 在这两种情况下要附加错误的东西到列表 - 在第一种情况下,一台发电机,第二附加现有列表内的列表。这些都不是你想要的。

您尝试以两种不同的方式同时做某件事,但它不起作用。只需使用列表理解 - 它以最高效和可读的方式执行您想做的事情。

你的主要问题是你似乎已经采取了列表内涵和发电机及表达,而不了解它们是什么以及他们正在尝试做的。我建议你在使用它们之前尝试进一步了解它们。

1

我的问题是有关解释和标点,然后。为什么 Python的“知道”追加/不追加 周围列表括号扩张“为list_of_lists列表命中[0]”(因此需要它 任何重写)?

不知道什么是应该的意思。我想你可能不知道除了列表解析[i*2 for i in range(0,3)]还有发生器表达式(i*2 for i in range(0,3))

生成器表达式是用于创建执行映射的生成器的语法,就像列表理解(但是作为生成器)。任何列表理解[c]可以改写list(c)。在list()内部存在裸体的原因是因为在生成器表达式作为调用的参数出现的情况下,允许删除括号。这是你在a.append(hit[0] for list in list_of_lists)看到的。