记录关于更优雅&高效的Python数据结构’✨✨
别的不说,要是给别人,起码能水出十篇以上的文章!!!
关于排序,可以看这篇文章【Python】通用排序指北(指南):https://blog.csdn.net/weixin_45081575/article/details/127461469
Python内置模块:collections
生成器
推导式
>>> _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.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)中的key,value为list(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]}
常会有解包的需要,当遇到是列表或元组形式的数据格式时候,更多的操作是通过下标去解包。在传递的数据过多时候,就极有可能出现麻烦。命名元组,可以解决这一问题。
命名元组,优雅至极
员工
的元组,使用时候,只需要传入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~