|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
列表生成(list comprehension)
; ~2 P/ D+ Y( x' I
# M, `# m: A, x- K9 R列表生成是Python2.0中加入的一种语法,可以非常方便地用来生成列表和迭代器,比如上节中map的两个例子和filter的一个例子可以用列表生成重写为:
+ H( X: z, y8 N6 x8 a& a[x**2 for x in [1, 2, 3, 4]] # [1, 4, 9 16]* u4 j; N( n$ n$ x
" S) ]& @ B( {& D1 g/ _0 ?0 O
[sum(x) for x in zip([1, 2, 3], [5, 6, 7])] # [6, 8, 10]: M5 }2 q& J6 }. I6 `+ y& `7 h& a
& M3 S, G5 b6 r& h- ^
[x for x in [1, 2, 3, 4, 5] if x % 2] # [1, 3, 5]
$ L. j9 B% |$ P# I4 y
: {7 }4 l/ d1 r- hzip()函数可以把多个列表关联起来,这个例子中,通过zip()可以按顺序同时输出两个列表对应位置的元素对。有一点需要注意的是,zip()不会自动帮助判断两个列表是否长度一样,所以最终的结果会以短的列表为准,想要以长的列表为准的话可以考虑itertools模块中的izip_longest()。如果要生成迭代器只需要把方括号换成括号,生成字典也非常容易:
+ M$ w: I6 V' p0 P( piter_odd = (x for x in [1, 2, 3, 4, 5] if x % 2)4 f$ W2 V- n+ E2 ]
3 X0 J2 b5 \- `$ L4 _) g
print(type(iter_odd)) ## \5 b( P; N) U+ H; v! i3 B" M D
% R/ o: v7 x$ a, [square_dict = {x: x**2 for x in range(5)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}. @7 G- w! ?5 U# \
) w! k6 e* r u5 c3 B2 Y4 z) [
至于列表生成和map/filter应该优先用哪种,这个问题很难回答,不过Python创始人Guido似乎不喜欢map/filter/reduce,他曾在表示过一些从函数式编程里拿来的特性是个错误。 | . x2 V4 y+ |3 h' e- m
|
|