【Python】优雅高效的 数据结构&推导式&生成器

文章目录

  • 前言
  • 知识点
  • 数据结构
    • 列表(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))
<class '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~

你可能感兴趣的:(python,数据结构,numpy)