Python 里使用 [] 创建一个列表。容器类型的数据进行运算和操作,生成新的列表最高效的办法——列表生成式。
列表生成式优雅、简洁,值得多多使用!
实现对每个元素的乘方操作后,利用列表生成式返回一个新的列表。
In [1]: a = range(0,11) In [2]: b = [x**2 for x in a] # 利用列表生成式创建列表 In [3]: b Out[3]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]数值型的元素列表,转换为字符串类型的列表:
In [1]: a = range(0,10) In [2]: b = [str(i) for i in a] In [3]: b Out[3]: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']生成 10 个 0 到 1 的随机浮点数,保留小数点后两位:
from random import random a = [round(random(),2) for _ in range(10)]生成 10 个 0 到 10 的满足均匀分布的浮点数,保留小数点后两位:
from random import uniform a = [round(uniform(0,10),2) for _ in range(10)]列表生成式中嵌套if语句: 对一个列表里面的数据筛选,只计算 [0,11) 中偶数的平方:
a = range(11) c = [x**2 for x in a if x%2==0] print(c) >> [0, 4, 16, 36, 64, 100]列表生成式中嵌套 for语句: 如下使用嵌套的列表,一行代码生成 99 乘法表的所有 45 个元素:
a = [i*j for i in range(10) for j in range(1,i+1)] >>zip(*iterables)——创建返回一个迭代器,聚合每个可迭代对象的元素。
#zip单独使用 a = [0, 1, 2, 3] b = ['a', 'b', 'c', 'd'] print(list(zip(a,b))) >> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] #列表生成式结合zip函数使用 a = range(5) b = ['a','b','c','d','e'] c = [str(y) + str(x) for x, y in zip(a,b)] print(c) >> ['a0', 'b1', 'c2', 'd3', 'e4']再结合 if,返回文件夹的名字列表:
import os dirs = [d for d in os.listdir('D:/source/test') if os.path.isdir(d)] print(dirs) >> ['.vscode', 'templates', '__pycache__']只查找出文件。
import os files = [d for d in os.listdir('D:/source/test') if os.path.isfile(d)] print(files) >> ['a.sql','barchart.py','barstack.py','bar_numpy.py']该写法可能会有问题,因为 Python 的列表类型可以不同,如果列表 a:
a = ['Hello', 'World',2020,'Python'] [w.lower() for w in a] --------------------------------------------------------------------------- AttributeError: 'int' object has no attribute 'lower'如上就会出现 int 对象没有方法 lower 的问题,先转化元素为 str 后再操作:
a = [str(w).lower() for w in a] print(a) >> ['hello', 'world', '2020', 'python']更友好的做法,使用 isinstance,判断元素是否为 str 类型,如果是,再调用 lower 做转化:
a = [w.lower() for w in a if isinstance(w,str) ] print(a) >> ['hello', 'world', 'python']列表 a、b 中元素经过 fn 映射后,返回在 a 不在 b 中的元素。
from math import floor def difference_by(a, b, fn): _b = set(map(fn, b)) return [item for item in a if fn(item) not in _b] #列表元素为单个元素: b = difference_by([2.1, 1.2], [2.3, 3.4],floor) print(b) >> [1.2] #列表元素为字典: c = difference_by([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], lambda v : v['x']) print(c) >> [{'x': 2}]