2015-01-15 137 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

相關問題