列表展开式
2017-01-01 本文已影响0人
Black先森
运行环境 python 2.7.12
列表是Python内置的一种数据类型,Python拥有非常多的技巧方法,主要是为了简化代码,使Python的代码看起来更加简洁优雅。那么列表的生成式(或者成为列表展开式)就是一种操作列表的小技巧。
- 要生成一个从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')]
- 接下来再来模拟一种排列组合类型,如果有两个字符串
ABC
,XYZ
我们要得到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'}]
- 假设一个列表函数多种类型的元素,只需要筛选出数字类型的元素。
>>> 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]
- 列表展开式也能包含我们自定义的函数。
>>> [i for i in range(10) if (lambda x: x % 2 != 0)(i)]
[1, 3, 5, 7, 9]