列表展开式

2017-01-01  本文已影响0人  Black先森

运行环境 python 2.7.12

列表是Python内置的一种数据类型,Python拥有非常多的技巧方法,主要是为了简化代码,使Python的代码看起来更加简洁优雅。那么列表的生成式(或者成为列表展开式)就是一种操作列表的小技巧。

  1. 要生成一个从1到10的列表,使用range函数,但是如果要生成
    从1到10的平方数呢?当然我们也有办法。
data = []
for i in range(1, 11):
    data.append(i * i)

print data
#  [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

显然对于Python来说4行代码看起来费劲,Python的哲学是,总希望
最优雅的实现这个问题,于是列表展开式

>>> [i * i for i in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

如果要得到前十个数中奇数的平方,只需要加上if判断即可

>>> [i * i for i in range(1, 11) if i % 2 != 0]
 [1, 9, 25, 49, 81]

当然列表内部元素也可以是列表或者元组等任意数据类型

>>> [(m,n) for m in range(3) for n in "abc"]
[(0, 'a'), (0, 'b'), (0, 'c'), (1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c')]
  1. 接下来再来模拟一种排列组合类型,如果有两个字符串ABCXYZ我们要得到AX, AY,AZ,BX,BY,BZ ...一共9种类型。当然使用两个for
    的嵌套就可以了
>>> [x + y for x in 'ABC' for y in 'XYZ'] # 每个元素为字符串
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
>>> [(x, y) for x in 'ABC' for y in 'XYZ'] # 每个元素为元组
[('A', 'X'),
 ('A', 'Y'),
 ('A', 'Z'),
 ('B', 'X'),
 ('B', 'Y'),
 ('B', 'Z'),
 ('C', 'X'),
 ('C', 'Y'),
 ('C', 'Z')]
 >>> [{x:y} for x in 'ABC' for y in 'XYZ'] # 每个元素为字典
[{'A': 'X'},
 {'A': 'Y'},
 {'A': 'Z'},
 {'B': 'X'},
 {'B': 'Y'},
 {'B': 'Z'},
 {'C': 'X'},
 {'C': 'Y'},
 {'C': 'Z'}]

  1. 假设一个列表函数多种类型的元素,只需要筛选出数字类型的元素。
>>> a = ['abx', '2bxs', 1, 2, 19, [1,2,3], '100', 12.6, 100.5]
>>> [x for x in a if isinstance(x, (int, float))] # 筛选出int和float型的数据
[1, 2, 19, 12.6, 100.5]
  1. 列表展开式也能包含我们自定义的函数。
>>> [i for i in range(10) if (lambda x: x % 2 != 0)(i)]
[1, 3, 5, 7, 9]
上一篇下一篇

猜你喜欢

热点阅读