|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
列表生成(list comprehension)
( X9 v5 G" T& C* \5 I, N) L+ o& i2 Q9 s+ J2 |4 c, c% ?2 L
列表生成是Python2.0中加入的一种语法,可以非常方便地用来生成列表和迭代器,比如上节中map的两个例子和filter的一个例子可以用列表生成重写为:
/ t% I% ~+ L& t" L+ o[x**2 for x in [1, 2, 3, 4]] # [1, 4, 9 16]
0 x. t& v5 j/ M A
4 |# T; }1 o% C7 k[sum(x) for x in zip([1, 2, 3], [5, 6, 7])] # [6, 8, 10]
1 Q1 @' B! q- c8 @4 [! H
. k J& N: y/ P; |/ \$ ^6 _9 u2 A' i[x for x in [1, 2, 3, 4, 5] if x % 2] # [1, 3, 5]) w) X, E j9 W. P+ j) k) u& {! s
% ~ K- R% T7 e# M9 j" c
zip()函数可以把多个列表关联起来,这个例子中,通过zip()可以按顺序同时输出两个列表对应位置的元素对。有一点需要注意的是,zip()不会自动帮助判断两个列表是否长度一样,所以最终的结果会以短的列表为准,想要以长的列表为准的话可以考虑itertools模块中的izip_longest()。如果要生成迭代器只需要把方括号换成括号,生成字典也非常容易:* q! n. l2 ]. Q* F4 Y$ f) O
iter_odd = (x for x in [1, 2, 3, 4, 5] if x % 2)
' O6 n; J, W; m t/ }. o0 Z! b& z2 {1 `1 R7 K) Y5 ]8 v5 [
print(type(iter_odd)) #
) c- e1 H& @- `6 R% N9 |9 |0 u
: S, b7 f+ S5 ]" q3 q5 ~" }square_dict = {x: x**2 for x in range(5)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
) h7 W# G: b% C0 h4 E: r
9 p* A$ H) g! U1 s, g至于列表生成和map/filter应该优先用哪种,这个问题很难回答,不过Python创始人Guido似乎不喜欢map/filter/reduce,他曾在表示过一些从函数式编程里拿来的特性是个错误。 |
7 e4 S' q' E" e/ d F |
|