Python基础之列表/元组/字典/集合递推式

列表递推式:

有一个列表a=[1,2,3],需要得到一个新的列表b=[10,20,30],可以看出将a中的每个元素乘以10就可以得到b中的元素。

按照常规的写法,使用for循环,遍历列表中的每个元素,进行乘以10的操作,再加入列表

如:

a = [1, 2, 3]
b = []
for i in a:
    b.append(i*10)
print(b)      # 输出[10, 20, 30]

如果使用列表递推式,可以将三行代码浓缩成一行代码,如下

a = [1, 2, 3]
b = [i*10 for i in a]
print(b)       # [10, 20, 30]

列表递推式的公式为:

variable = [ out_exp_res  for out_exp in input_list  if  out_exp_condition]

上述表达式可以分为三部分,分别用不同的颜色标注出来了。他们都代表什么意思呢?

out_exp_res:列表variable生成元素的表达式,也可以是一个有返回值的函数。

for out_exp in input_list:迭代input_list,将每次迭代的值out_exp传入到out_exp_res表达式中。

if  out_exp_condition(可有可无)为过滤条件,每次迭代的值out_exp满足过滤条件后,再传入到out_exp_res表达式中。

例如,列表a=[1,2,3],需要得到一个新的列表c=[10,30],可以发现只有当a中的元素为奇数时才进行乘以10的运算

a = [1, 2, 3]
b = [i*10 for i in a if i%2 != 0]
print(b)      # 输出[10, 30]

列表递推式中,for循环可以嵌套,if判断语句也可以嵌套,但是这样代码的可读性很差,所以当有复杂的嵌套循环和判断时,不适宜用列表递推式。

元组递推式:

与列表递推式的公式一样,需要将[]换成()

variable = ( out_exp_res  for out_exp in input_list  if  out_exp_condition )

得到的variable是一个生成器,需要使用tuple()进行转化。

tup_a = (i*2 for i in range(9) if i%2 == 0)
print(tup_a)   # 得到的是一个生成器,输出<generator object <genexpr> at 0x1047d0040>
# 使用tuple()进行转化
print(tuple(tup_a))    # 输出(0, 4, 8, 12, 16)

字典递推式:

可以从任何以键值对作为元素的可迭代对象中构建出字典。

字典推导式,也是创建字典的一种途径。

他的语法结构:

variable = { out_exp_res  for out_exp in input_list  if  out_exp_condition }

用大括号包围,第一部分为所需要提取和赋值的键值对,再就是循环语句,再就是逻辑分支语句(没有可不写),与列表递推式类似。

例如:

# 使用字典递推式创建一个字典
d = {k:v for k,v in [('name','qq'),('age','13')] }
print(d)

#   输出{'name': 'qq', 'age': '13'}

例一:给定一个字典对象{'a': 1, 'b': 2, 'c': 3},找出其中所有大于 1 的键值对,同时 value 值进行平方运算。

# # 未使用字典推导式的写法
dc = {'a': 1, 'b': 2, 'c': 3}
d_old = dict()
for k, v in dc.items():
    if v > 1:
        d_old[k] = v ** 2
print(d_old)      # 输出{'b': 4, 'c': 9}

# 使用字典推导式
d_new = {k : v ** 2 for k,v in dc.items() if v > 1 }
print(d_new)      # 输出{'b': 4, 'c': 9}

例二:给定一个字典对象,请使用字典推导式,将它的key和value分别进行交换。也就是key变成值,值变成key。

# 输入: {'a': 1, 'b': 2, 'c': 3}
# 输出: {1: 'a', 2: 'b', 3: 'c'}
dic_a = {'a': 1, 'b': 2, 'c': 3}
dic_b = {v:k for k,v in dic_a.items()}
print(dic_b)   # 输出{1: 'a', 2: 'b', 3: 'c'}

集合递推式:

        与字典递推式一致,

        variable = { out_exp_res  for out_exp in input_list  if  out_exp_condition }

与字典递推式的区别在于out_exp_res,字典递推式的out_exp_res是一个键值对,反之则是集合递推式

s = {n*2 for n in range(4)}
print(s)     # 输出{0, 2, 4, 6}

集合推导式中的元素必须是唯一的

tup = (1,1,2,2,3,4,5,6)
s = {i**2 for i in tup if i%2==0}
print(s)    # 输出{16, 4, 36}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值