2015-01-15 139 views
-1
a=[['1','3','2'],['11','22','33']] 
k = [(float(a[i][j]) for j in range(0,3)) for i in range(0,2)] 
>>> print k 
[<generator object <genexpr> at 0x7f1a9d568f50>, <generator object <genexpr> at 0x7f1a9d568fa0>] 

但我想得到[(1,3,2),(11,22,33)] 为什么列表理解会产生一个生成器?Python:为什么列表理解会产生一个生成器?

+7

由于'(浮子(A [i] [j])对于范围(0,3)中的j)'是一个生成器表达式 – vaultah 2015-01-15 16:36:01

+0

因为你在其中放置了一个生成器表达式?这就是'(...对于范围(0,3)中的j)'* *在那里。 – 2015-01-15 16:36:11

+1

[<发生器对象 at 0x7f1a9d568f50>,...]实际上是发生器的_LIST_。 – NaeiKinDus 2015-01-15 16:36:56

回答

7

你有一个generator expression(x for x in ...))里面的列表理解([x for x in ...])。这将返回一个生成器对象列表。更改像这样

a = [['1','3','2'],['11','22','33']] 
k = [[float(a[i][j]) for j in range(0,3)] for i in range(0,2)] 

print(k) 
# [[1.0, 3.0, 2.0], [11.0, 22.0, 33.0]] 
+0

是否可以得到[(1,3,2),(11,22,33)]? – lily 2015-01-15 16:42:52

+1

是的。你可以将列表理解包装在一个元组调用中,所以'[tuple([...])for ...]'。但是,我建议你看看Martijn Pieter的答案,因为他解释了如何以更整洁的方式获得你想要的东西:) – Ffisegydd 2015-01-15 16:43:48

6

您正在使用您的列表解析表达式生成器表达式的代码:如果你想,要执行像列表解析,使

(float(a[i][j]) for j in range(0,3)) 

列表理解

[[float(a[i][j]) for j in range(3)] for i in range(2)] 

如果你需要那些是元组,那么你是升显式调用tuple()

[tuple(float(a[i][j]) for j in range(3)) for i in range(2)] 

tuple()调用将驱动发电机表达以产生这些值的元组。有no such thing as a tuple comprehension,否则。

而不是使用范围,可以遍历a和嵌套列表直接

[tuple(float(v) for v in nested) for nested in a] 

演示:

>>> a=[['1','3','2'],['11','22','33']] 
>>> [tuple(float(v) for v in nested) for nested in a] 
[(1.0, 3.0, 2.0), (11.0, 22.0, 33.0)] 
+0

他们可能想做“元组理解”... – vaultah 2015-01-15 16:39:18

+0

@vaultah:好点,调整。 – 2015-01-15 16:41:05

相关问题