深度解析python中的数据结构和算法(四)

接着上一篇的分享继续往下看

目录

1.过滤列表元素

2.从字典中提取子集

3.映射名称到序列元素

4.转换并同时计算数据

5.合并多个字典或映射

6.结束语

1.过滤列表元素

问题:有一个数据序列,用一些规则从中提取出需要的值或缩短序列

思路:最为简洁的方式就是使用列表推导式去解决

代码实现:

list1 = [-1,2,-5,3,7,8,-9]
new_list = [i for i in list1 if i > 0]
print(new_list)  # [2, 3, 7, 8]

延伸:如果过滤的列表元素很复杂,例如不是常见的数字,一般情况下,不建议使用推导式去解决,而是使用我们的函数filter()

代码实现:

list1 = [-1,2,-5,3,7,8,-9,'-','url','*']
def eval_list(val):
    try:
        x = int(val)
        return True
    except Exception as e:
        return False
newlist = list(filter(eval_list,list1))
print(newlist)

注意:filter函数接收两个参数,第一个参数是方法或者none,第二个参数是一个迭代器。且filter过滤后的对象也是一个迭代器,所以要想看到列表过滤内容,还需要list转换为列表。

2.从字典中提取子集

问题:如果你想将一个字典中的子集提取出来作为一个新的字典该如何实现?

思路:最简单的方法是字典推导式

代码实现:

score = {
    '语文':115,
    '数学':136,
    '英语':107,
    '物理':87,
    '化学':75,
    '生物':76,
}
new_dict = {i:j for i,j in score.items() if j > 100}
print(new_dict)  # {'语文': 115, '数学': 136, '英语': 107}

延伸:如果字典推到式可以做到的过滤操作,那么我们的dict也可以实现

代码实现:

score = {
    '语文':115,
    '数学':136,
    '英语':107,
    '物理':87,
    '化学':75,
    '生物':76,
}
new_dict = dict((i,j) for i,j in score.items() if j > 100)
print(new_dict)  # {'语文': 115, '数学': 136, '英语': 107}

注意:dict函数接收两个参数,第一个参数seq默认为none,指在接收我们的key,value。第二个参数是我们的非哈希数据结构,一般就是我们的字典,这里就是指接收第二个参数,第一个参数默认了。

3.映射名称到序列元素

问题:我们都知道可以通过索引来访问列表或者元组中的元素,此时如果想通过名称来访问该如何访问呢?

思路:以上问题其实翻译过来就和我们的命名切片差不多,只不过这里要理解成为命名的列表或者元组,使用我们的collections模块中的namedtuple函数即可解决。

代码实现:

from collections import namedtuple
rule = namedtuple('阿里巴巴',['name','sex','addr'])
people1 = rule('张三','男','西安')
print(people1) # 阿里巴巴(name='张三', sex='男', addr='西安')
print(people1.name)  # 张三
print(people1.sex)  # 男

注意:namedtuple的参数有两个,第一个可以理解成类型,第二个可以理解成这个类型里面的信息。

4.转换并同时计算数据

问题:如果想在一个序列上执行聚集函数(比如sum(),min()...),但是需要先转换或者过滤数据

思路:可以结合数据计算与转换就是使用一个生成器表达式参数。

代码实现:

num = [1,2,3,4,5]
s = sum(i*i for i in num)
print(s)  #  55

5.合并多个字典或映射

问题:有多个字典,现在要把这个字典合并,然后去查找值或者键

思路:先合并字典,字典的键是唯一的,假如有相同的键,那么值应该是要合并进去的。那么我们的chainmap就可以解决这个问题,其原理就是先去第一个字典找我们要的值,如果没有就去第二字典找,我特别喜欢这个函数,因为翻译过来很高大上:中国地图

代码实现:

from collections import ChainMap
a = {'x':7,'y':6}
b = {'x':10,'z':5}
d = ChainMap(a,b)
print(d['x'])  # 7
print(d['y'])  # 6
print(d['z'])  # 5

6.结束语

截止到第四遍,深度解析python中的数据结构和算法就告一段落了,有好的建议欢迎留言。如果文章有讲述不清楚或者有误的地方,还请提出指正。喜欢的朋友点赞收藏关注,后续还会分享更多有关python巧妙的方法,让你的代码更健壮,更清晰。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戒酒的李白-Lisage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值