12列表推导式

2.1.9 列表推导式

  • 列表推导式使用非常简洁的方式来快速生成满足特定需求的列表,代码具有非常强的可读性
aList = [x * x for x in range(10)]
==>
#使用内置函数
aList = []
for x in range(10):
	aList.append(x * x )
==>
#函数式编程
aList = list(map(lambda x:x * x,range(10)))
#一共64个小格子,在第一个格子里放1粒米,第二个格子里放2粒米,第三个格子里放4粒米,第四个格子里放8粒米,以此类推,后面每个格子里的米都是前一个格子里的2倍,一直把64个格子都放满。需要多少粒米呢?
>>> sum([2 ** i for i in range(64)])
18446744073709551615
>>> sum(2 ** i for i in range(64))
18446744073709551615
  • 使用列表推导式实现嵌套的平铺
>>> vec = [[1,2,3],[4,5,6],[7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> result = []
>>> for elem in vec:
	for num in elem:
		result.append(num)

		
>>> result
[1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 不使用列表推导式
#方法一
>>> sum(vec,[])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
#sum用法
>>> help(sum)
Help on built-in function sum in module builtins:

sum(iterable, start=0, /)
    Return the sum of a 'start' value (default: 0) plus an iterable of numbers When the iterable is empty, return the start value.
#方法二
>>> from itertools import chain
>>> list(chain(*vec))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 列出当前文件夹下所有python源文件
import os
[filename for filename in os.listdir('.') if filename.endwith(('.py','.pyw'))]
  • 过滤不符合条件的元素
>>> aList = [-1,-4,6,7.5,-2.3,9,-11]
>>> [i for i in aList if i>0]
[6, 7.5, 9]
#已知有一个包含一些同学成绩的字典,计算成绩的最高分、最低分、平均分,并查找所有最高分同学
>>> scores = {"zhangsan":45,"lisu":78,"Wang Wu":40,"Zhou Liu":96,"zhao Qi":65,"su ba":90,"zheng ju":78,"wu shi":99,"dong shiyi":60}
>>> higest = max(scores.values())
>>> lowest = min(scores.values())
>>> average = sum(scores.values()) * 1.0 / len(scores)
>>> higest,lowest,average
(99, 40, 72.33333333333333)
>>> highestPerson = [name for name,score in scores.items() if score == higest]
>>> highestPerson
['wu shi']
  • 在列表推导式中使用多个循环,实现多序列元素的任意组合,并可以结合条件语句过滤特定元素
>>> [(x,y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
>>> [(x,y) for x in [1,2,3] for y in (2,3,4) if x != y]
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 2), (3, 4)]
  • 使用列表推导式实现矩阵转置
>>> matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
#使用列表推导式实现矩阵转置
>>> list(zip(*matrix))  #序列解包
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
  • 列表推导式可以使用函数或复杂表达式
>>> def f(v):
	if v % 2 ==0:
		v = v ** 2
	else:
		v = v + 1
	return v

>>> [f(v) for v in [2,3,4,-1] if v > 0]
[4, 4, 16]
#使用复杂表达式
>>> [v ** 2 if v % 2 == 0 else v + 1 for v in [2,3,4,-1] if v > 0]
[4, 4, 16]
  • 列表推导式支持文件对象迭代
with open('c:\\RHDSetup.log','r') as fp:
	print([line for line in fp])
#使用列表推导式生成100以内的所有素数
>>> [p for p in range(2,100) if 0 not in [p % d for d in range(2,int(p ** 0.5)+1)]]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

2.1.10 使用列表实现向量运算

>>> import random
>>> x = [random.randint(1,100) for i in range(10)] #生成随机数
>>> y = [random.randint(1,100) for i in range(10)]
>>> list(map(lambda i: i + 5,x)) #所有元素同时加5
[46, 70, 65, 68, 34, 64, 105, 9, 11, 103]
>>> x = [random.randint(1,10) for i in range(10)]
>>> y = [random.randint(1,10) for i in range(10)]
>>> import operator
>>> sum(map(operator.mul,x,y))
357
>>> sum((i * j for i,j in zip(x,y)))
357
>>> list(map(operator.add,x,y))
[10, 14, 10, 16, 7, 20, 11, 7, 11, 13]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值