3行for循环 vs 1行列表推导式,速度差10倍,代码量差10倍
# 旧: 3行result = []for x in range(20): if x % 2 == 0: result.append(x)# 新: 1行result = [x for x in range(20) if x % 2 == 0]# → [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 旧: 5行squares = []for x in range(1, 11): if x % 2 == 0: squares.append(x ** 2)# 新: 1行squares = [x**2 for x in range(1, 11) if x % 2 == 0]# → [4, 16, 36, 64, 100]
# 旧: 4行pairs = []for x in [1, 2, 3]: for y in [4, 5, 6]: pairs.append((x, y))# 新: 1行pairs = [(x, y) for x in [1,2,3] for y in [4,5,6]]# → [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]
# 一行生成字典words = ["hello", "world", "python"]lengths = {w: len(w) for w in words}# → {"hello": 5, "world": 5, "python": 6}# 一行过滤字典d = {"a": 1, "b": 2, "c": 3, "d": 4}big = {k: v for k, v in d.items() if v > 2}# → {"c": 3, "d": 4}
# 一行集合squares_set = {x**2 for x in range(-5, 6)}# → {0, 1, 4, 9, 16, 25}# 一行去重unique = {x for x in [1, 2, 2, 3, 3, 3]}# → {1, 2, 3}
# 不占内存的列表(大数据场景)gen = (x**2 for x in range(10**8))print(next(gen), next(gen)) # 0, 1# vs 普通列表(占内存)lst = [x**2 for x in range(10**8)] # 内存爆炸
类型 | 语法 | 示例 |
列表推导式 | [x for x in lst] | [x for x in range(10)] |
筛选版 | [x for x in lst if cond] | [x for x in range(10) if x%2==0] |
字典推导式 | {k:v for k,v in d.items()} | {k:len(k) for k in words} |
集合推导式 | {x for x in lst} | {x**2 for x in range(10)} |
生成器 | (x for x in lst) | (x**2 for x in range(10**8)) |
-------------------------它是数字世界里的一把杀猪刀
却总能巧夺天工
它的世界是纯粹0、1组合
却总能创造无尽幻想
......
本公众号关注数据价值分析、编程学习,将不定期更新社会热点数据分析结果、编程技巧,分享数据分析工具、方法、学习等内容,欢迎有兴趣的小伙伴加入。