【Python】优雅高效的 数据结构推导式生成器
创始人
2024-01-13 02:12:17

文章目录

  • 前言
  • 知识点📖📖
  • 数据结构
    • 列表(list)
      • 排序
      • 插入
      • 取出现次数最多的元素
    • 字典(dict)
      • 获取键、值
      • 有序字典
      • 有初始值的dict
    • 元组(tuple)
  • 生成器和推导式
    • 生成器
    • 推导式
      • 最基本的推导式
      • 多层嵌套推导式
  • 后话

前言

记录关于更优雅&高效的Python数据结构’✨✨

别的不说,要是给别人,起码能水出十篇以上的文章!!!

知识点📖📖

关于排序,可以看这篇文章【Python】通用排序指北(指南):https://blog.csdn.net/weixin_45081575/article/details/127461469

Python内置模块:collections

生成器
推导式


数据结构

列表(list)

排序

>>> _list = [10, 20, 40, 30]# 正向排序
>>> _list.sort()	# reverse默认为False,故可省略
>>> print(_list)
[10, 20, 30, 40]# 逆向排序
>>> _list.sort(reverse=True)
>>> print(_list)
[40, 30, 20, 10]

插入

>>> _list = [10, 20, 40, 30]# 插入到最后面
>>> _list.extend([50])
>>> print(_list)
[10, 20, 40, 30, 50]# 插入到指定位置
>>> _list.insert(1, 100)	# 在索引为1处插入 100
>>> print(_list)
[10, 100, 20, 40, 30]

取出现次数最多的元素

>>> _list = [10, 10, 20, 40, 30]>>> print(max(set(_list), key=_list.count))
10>>> from collections import Counter
>>> print(Counter(_list).most_common(1))
[(10, 2)]

字典(dict)

获取键、值

获取指定键时候 ,建议使用 dict.get(key) 方法,get访问不存在的键不会报错,且返回 None,也可指定键不存在时候返回的值。

>>> _dict = {'name': '靓仔', 'age': 18}# 获取指定键的值
>>> print(_dict['name'])
靓仔
>>> print(_dict.get('name'))
靓仔
>>> print(_dict.get('name_name', '帅哥'))
帅哥# 获取所有键
>>> print(_dict.keys())
dict_keys(['name', 'age'])# 获取所有值
>>> print(_dict.values())
dict_values(['靓仔', 18])

有序字典

有时候保持dict的有序性,非常重要

>>> from collections import OrderedDict>>> _dict = OrderedDict()
>>> _dict['1'] = 1
>>> _dict['2'] = 2
>>> _dict['3'] = 3
>>> _dict['4'] = 4
>>> _dict['5'] = 5
>>> print(_dict)
OrderedDict([('1', 1), ('2', 2), ('3', 3), ('4', 4), ('5', 5)])

有初始值的dict

现需求如下:添加不存在字典(dict)中的keyvaluelist(key)

一般的代码书写如下:

>>> _dict = dict()
>>> for num in range(1, 4):
>>>     if not _dict.get(num):
>>>         _dict[num] = list()
>>>     _dict[num].append(num)
>>> print(_dict){1: [1], 2: [2], 3: [3]}

而使用 collections.defaultdict 的代码,看起来更加简洁

  • defaultdict(list):当key不存在时候,为该key生成为 list()value
>>> from collections import defaultdict>>> _dict = defaultdict(list)
>>> for num in range(1, 4):
>>>     _dict[num].append(num)
>>> print(_dict){1: [1], 2: [2], 3: [3]}

元组(tuple)

常会有解包的需要,当遇到是列表或元组形式的数据格式时候,更多的操作是通过下标去解包。在传递的数据过多时候,就极有可能出现麻烦。命名元组,可以解决这一问题。

命名元组,优雅至极

  • 这里定义了一个员工的元组,使用时候,只需要传入5个值,后面再解包时候便可以根据field来拿到正确的值了。
>>> from collections import namedtuple>>> employees = namedtuple('employees', field_names=['name', 'age', 'gender', 'salary', 'height'])
>>> e = employees(*['小菜', '20', '🚹', '🐱', '💕'])
>>> print(e)
employees(name='小菜', age='20', gender='🚹', salary='🐱', height='💕')>>> e.name
小菜
>>> e.gender
🚹
>>> e.height
💕

生成器和推导式

这里值得注意的是,如果容器的数据量特别大,一定一定要用生成器,而不要使用推导式因为生成器比较节省内存。具体可看这里:https://blog.csdn.net/weixin_45081575/article/details/126050380

生成器

格式:(expression for item in Sequence)
生成器表达式和元组推导式是一模一样的,使用tuple(generator) 便可将生成器转换成元组了。

>>> generator = (i for i in range(10))>>> print(type(generator))
# 获取生成器的值
>>> print(generator.__next__())
0
>>> print(generator.__next__())
1
>>> print(tuple(generator))	# 转换成元组
(2, 3, 4, 5, 6, 7, 8, 9)

推导式

推导式的格式为

  • (expression for item in Sequence )
  • (expression for item in Sequence if condition)
  • (expression if condition else expression for item in Sequence)

格式当然还可以更加复杂,但是再复杂的话代码的可读性就大大降低了~


列表(list),元组(tuple),集合(set),它们的推导式是一模一样的,区别在于包括它们的括号

类型括号示例
列表[][i for i in range(10)]
集合{}{i for i in range(10)}
元组()(i for i in range(10))
字典{}{i:i for i in range(10)}

最基本的推导式

# 生成0~9的列表
>>> print([i for i in range(10)])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# 生成0~9中大于4的列表
>>> print([i for i in range(10) if i > 4])
[5, 6, 7, 8, 9]# 生成0~9中大于4的列表,小于4的置为0
>>> print([i if i > 4 else 0 for i in range(10)])
[0, 0, 0, 0, 0, 5, 6, 7, 8, 9]# 生成0~9的字典,key:value相等
>>> print({i: i for i in range(10)})
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}

多层嵌套推导式

  • 嵌套多层不可取,可读性大大降低
# 双层嵌套推导式
>>> container = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
>>> print([i for item in container for i in item if i > 3])
[4, 7, 5, 8, 6, 9]# 三层嵌套推导式
>>> container = [[(1, 4)], [(2, 5)], [(3, 6)]]
>>> print([i for _list in container for _tuple in _list for i in _tuple if i > 2])
[4, 5, 3, 6]

后话

本次分享到此结束,🐱‍🏍🐱‍🏍
see you~

相关内容

热门资讯

demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...