|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
列表生成(list comprehension) I+ i& M* Y1 e5 D) v: t: F
& Y4 v# k4 n8 Z* k. m# M列表生成是Python2.0中加入的一种语法,可以非常方便地用来生成列表和迭代器,比如上节中map的两个例子和filter的一个例子可以用列表生成重写为:( L% Y! G! _: a1 W! g- Z* z0 y
[x**2 for x in [1, 2, 3, 4]] # [1, 4, 9 16]
+ r" i1 j( j2 z5 t5 I
$ ~1 z, ~1 d: M6 |1 g+ ~[sum(x) for x in zip([1, 2, 3], [5, 6, 7])] # [6, 8, 10]
4 g7 ^3 E3 K/ ~* k
$ ^% R* A1 t! x2 o5 ^$ ^9 q[x for x in [1, 2, 3, 4, 5] if x % 2] # [1, 3, 5]
6 z" o6 ^+ c9 c' i$ ~" P; a: ?( m1 V* w9 a* ^
zip()函数可以把多个列表关联起来,这个例子中,通过zip()可以按顺序同时输出两个列表对应位置的元素对。有一点需要注意的是,zip()不会自动帮助判断两个列表是否长度一样,所以最终的结果会以短的列表为准,想要以长的列表为准的话可以考虑itertools模块中的izip_longest()。如果要生成迭代器只需要把方括号换成括号,生成字典也非常容易:: Q! n V' N/ Y5 _
iter_odd = (x for x in [1, 2, 3, 4, 5] if x % 2)1 b5 D4 c, U# _. L+ m% V; \
* ~: p0 U" f% R
print(type(iter_odd)) #' S$ z6 e- y) p- Y8 o6 O
4 r& `: b/ l8 ^+ W7 H
square_dict = {x: x**2 for x in range(5)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
v6 X3 i5 y9 U, W, E- C: \1 Y3 A* m8 C2 Q
至于列表生成和map/filter应该优先用哪种,这个问题很难回答,不过Python创始人Guido似乎不喜欢map/filter/reduce,他曾在表示过一些从函数式编程里拿来的特性是个错误。 |
# P7 q8 x' {+ X# A3 B. d |
|