Python可变数据类型高效编程
用 Python 做数据分析,主要的技术栈是 Python 基础和三驾马车 NumPy、Pandas 和 Matplotlib。先搞定 Python 基础吧。
Python3 有六个标准数据类型
不可变类型:Number(数字)、String(字符串)、Tuple(元组)
可变类型:List(列表)、Dictionary(字典)、Set(集合)
相比不可变类型数据处理起来较明确,可变类型的骚操作就多很多。
你可以快速了解 Python 语法,基于这些语法知识,你可能能够尝试出你想得到的数据,但了解一些高阶技巧是很有必要的。
高阶技巧不仅能加快你 code 的速度,还能让代码更优美,从而实现高效编程。
本文针对这 3 个可变类型,提炼出 5 个高频问题,吃透这几个高阶编程技巧。
如何在列表、字典、集合中根据条件筛选数据
如何统计序列中元素的出现频率
如何根据字典中值的大小,对字典中的项进行排序
如何快速找到多个字典中的公共键
如何让字典保持有序
1.如何在列表、字典、集合中根据条件筛选数据
列表
filter 函数 filter(lambda x : x>=0, data)
列表解析 [x for x in data if x >= 0]
字典
字典解析 {k : v for k, v in d.iteritems() if v > 90}
集合
集合解析 {x for x in s if x%3 == 0}
列表
>>> from random import randint >>> data = [randint(-10, 10) for _ in range(10)] >>> data [2, -9, 2, -2, -10, -2, -1, 8, 3, 3] >>> filter(lambda x: x >= 0, data) [2, 2, 8, 3, 3] >>> [x for x in data if x >= 0] [2, 2, 8, 3, 3]
即使 filter 函数执行更快,耐不住列表解析既优美又连贯。工作中大家很爱用列表解析,推荐指数五颗星。
字典和集合
# 字典 >>> d = {x: randint(60, 100) for x in range(1, 11)} >>> d {1: 61, 2: 71, 3: 86, 4: 79, 5: 64, 6: 88, 7: 71, 8: 88, 9: 94, 10: 65} >>> {k: v for k, v in d.items() if v > 90} {9: 94}# 集合 >>> data [2, -9, 2, -2, -10, -2, -1, 8, 3, 3] >>> s = set(data) >>> s set([2, 3, 8, -2, -10, -9, -1]) >>> {x for x in s if x % 3 == 0} set([3, -9])
可以看到解析的方式代码很连贯,对于任何一个可迭代对象都可以用同样的逻辑去code。
2.如何统计序列中元素的出现频率
随机序列中元素频率统计
词频统计:找出出现次数最高的 5 个单词,及出现次数
>>> from random import randint >>> data = [randint(0, 5) for _ in range(10)] >>> data [5, 3, 4, 4, 1, 0, 5, 2, 0, 2] # 不依赖库生算 >>> c = dict.fromkeys(data, 0) >>> c {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0} >>> for x in data: c[x] += 1 >>> c {0: 2, 1: 1, 2: 2, 3: 1, 4: 2, 5: 2} >>> sorted(c.items(), key=lambda c: c[1]) [(1, 1), (3, 1), (0, 2), (2, 2), (4, 2), (5, 2)]# 用Counter库 >>> from collections import Counter >>> c2 = Counter(data) >>> c2 Counter({0: 2, 2: 2, 4: 2, 5: 2, 1: 1, 3: 1}) >>> c2.most_common(3) [(0, 2), (2, 2), (4, 2)]
Counter 神奇在于一键解决词频统计问题,在自然语言处理上大有妙用。
>>> import re # 待统计词频的文本 >>> txt="As we all know, environment pollution and energy waste have become some of the most important topics in this world. The best way to solve these problems is to live a low-carbon life. " >>> c3 = Counter(re.split('\W+', txt)) >>> c3 Counter({'to': 2, 'and': 1, '': 1, 'all': 1, 'energy': 1, 'some': 1, 'life': 1, 'have': 1, 'in': 1, 'carbon': 1, 'best': 1, 'environment': 1, 'live': 1, 'low': 1, 'way': 1, 'waste': 1, 'topics': 1, 'we': 1, 'problems': 1, 'most': 1, 'important': 1, 'know': 1, 'world': 1, 'The': 1, 'is': 1, 'a': 1, 'this': 1, 'of': 1, 'these': 1, 'As': 1, 'solve': 1, 'become': 1, 'the': 1, 'pollution': 1}) >>> c3.most_common(5) [('to', 2), ('and', 1), ('', 1), ('all', 1), ('energy', 1)]
3.如何根据字典值的大小对项排序
利用 zip 将字典数据转化为元组
传递 sorted 函数的 key 参数
>>> d = {x: randint(60, 100) for x in 'xyzabc'} >>> d {'a': 66, 'c': 77, 'b': 65, 'y': 85, 'x': 64, 'z': 83} # 对字典排序是返回key的排序结果 >>> sorted(d) ['a', 'b', 'c', 'x', 'y', 'z']# 利用zip将键值对转化为(值,键)的元组 >>> zip(d.values(), d.keys()) [(66, 'a'), (77, 'c'), (65, 'b'), (85, 'y'), (64, 'x'), (83, 'z')] >>> sorted(zip(d.values(), d.keys())) [(64, 'x'), (65, 'b'), (66, 'a'), (77, 'c'), (83, 'z'), (85, 'y')]# 传递sorted函数的key参数 >>> d.items() [('a', 66), ('c', 77), ('b', 65), ('y', 85), ('x', 64), ('z', 83)] >>> sorted(d.items(), key=lambda d: d[1]) [('x', 64), ('b', 65), ('a', 66), ('c', 77), ('z', 83), ('y', 85)]
灵活掌握内置函数的功能,会让你日常工作增效百倍。但是功能不可能是记全的,理解函数可以实现什么,那些标准执行过程一定有标准实现。
4.如何快速找到多个字典中的公共键
使用遍历硬编码
使用字典的 keys()方法,得到一个字典 keys 的集合,利用集合 set()的交集操作
使用 map 函数,得到所有字典的 keys 集合,再使用 reduce 函数, 取所有字典的 keys 的集合的交集
>>> from random import randint, sample >>> s1 = {x: randint(1, 4) for x in sample('abcdefg', randint(3, 6))} >>> s1 {'b': 2, 'd': 4, 'c': 1, 'e': 3, 'a': 1} >>> s2 = {x: randint(1, 4) for x in sample('abcdefg', randint(3, 6))} >>> s3 = {x: randint(1, 4) for x in sample('abcdefg', randint(3, 6))} >>> s2 {'g': 3, 'e': 4, 'd': 3, 'a': 4} >>> s3 {'d': 1, 'f': 1, 'e': 4, 'g': 4, 'b': 1}# 遍历生算 >>> res = [] >>> for k in s1: ... if k in s2 and k in s3: ... res.append(k) ... >>> res ['d', 'e']# 集合&求交集 >>> s1.keys() & s2.keys() & s3.keys() {'d', 'e'}# map 函数 + reduce 函数 >>> map(dict.keys, [s1, s2, s3]) <map object at 0x1028d2a90> >>> list(map(dict.keys, [s1, s2, s3])) [dict_keys(['b', 'd', 'c', 'e', 'a']), dict_keys(['g', 'e', 'd', 'a']), dict_keys(['d', 'f', 'e', 'g', 'b'])] >>> from functools import reduce >>> reduce(lambda a, b: a & b, map(dict.keys, [s1, s2, s3])) {'d', 'e'}
5.如何让字典保持有序
>>> d = {} >>> d['Jim'] = (1, 35) >>> d['Leo'] = (2, 37) >>> d['Bob'] = (3, 40) >>> d {'Jim': (1, 35), 'Leo': (2, 37), 'Bob': (3, 40)} >>> for k in d: ... print(k) ... Jim Leo Bob
上述字典实际上是无序的,无法保证其按排名顺序输出,虽然这个例子中是增序的。
>>> from collections import OrderedDict >>> d = OrderedDict() >>> d['Jim'] = (1, 35) >>> d['Leo'] = (2, 37) >>> d['Bob'] = (3, 40) >>> d OrderedDict([('Jim', (1, 35)), ('Leo', (2, 37)), ('Bob', (3, 40))]) >>> for k in d: ... print(k) ... Jim Leo Bob
Python基础部分还有可迭代对象、类等,这些在高阶编程中很有用,尤其是在数据分析中会自建一些代码工具。后面几篇会覆盖这些内容。
再往后会有数据分析三剑客:Numpy、Pandas和Matplotlib,以及随后的经典机器学习算法。
我的学习过程很苦,希望你们不苦。如果苦的话,有我陪你。
推荐阅读
Pandas处理数据太慢,来试试Polars吧!
懒人必备!只需一行代码,就能导入所有的Python库
绝!关于pip的15个使用小技巧
介绍10个常用的Python内置函数,99.99%的人都在用!
可能是全网最完整的 Python 操作 Excel库总结!
Python可变数据类型高效编程相关推荐
- Python 可变数据类型和不可变数据类型 - Python零基础入门教程
目录 一.关于内存 二.可变数据类型和不可变数据类型 1.可变数据类型和不可变数据类型区别 2.不可变数据类型 3.可变数据类型 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : P ...
- python可变数据类型和不可变数据类型_python 可变数据类型和不可变数据类型
python 可变数据类型和不可变数据类型 发布时间:2020-03-06 12:59:51 来源:51CTO 阅读:288 作者:qq5d6f345f0205e python数据类型分别有整数int ...
- python 可变数据类型和不可变数据类型
python数据类型分别有整数int / 浮点数float / 布尔值bool / 元组tuple / 列表list / 字典dict,其中数据类型分为两个大类,一种是可变数据类型:一种是不可变数据类 ...
- python可变数据类型与不可变数据类型
转载自: https://www.cnblogs.com/lfpython/p/7207747.html 一.什么可变数据类型和不可变数据类型 可变数据类型:value值改变,id值不变:不可变数据类 ...
- python可变数据类型和不可变数据类型
Python3可变数据类型与不可变数据类型 有很多人在刚开始接触 python 这个语言的时候,总是搞不清楚什么是 可变数据类型 什么是 不可变数据类型,今天就让我们通过这篇小文章来详细了解一下. 知 ...
- 你不知道的18个Python高效编程技巧
来源 | Python编程时光 初识Python语言,觉得python满足了我上学时候对编程语言的所有要求.python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行 ...
- 编程软件python中的if用法-Python高效编程的19个技巧
初识Python语言,觉得python满足了我上学时候对编程语言的所有要求.python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行的,终于解脱了.高级语言,如果做 ...
- 18 个 Python 高效编程技巧,Mark!
点击"小詹学Python",选择"置顶"公众号 重磅干货,第一时间送达 本文转载自Python数据科学,禁二次转载 初识Python语言,觉得python满足了 ...
- 干货 | 18个 Python 高效编程技巧
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 初识Python语言,觉得python满足了我上学时候对编程语言的 ...
最新文章
- 人人都能学会的python编程教程3:字符串和编码
- 让大规模深度学习训练线性加速、性能无损,基于BMUF的Adam优化器并行化实践...
- 都快下班了,才来写日记
- bootstrap-datepicker 日期格式设置
- C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并
- Bzoj 4147: [AMPPZ2014]Euclidean Nim(博弈)
- Windows Mobile 6.1开发笔记
- java 创建txt_JAVA读取TXT文件、新建TXT文件、写入TXT文件
- ui自动化html模板,UI自动化学习分享ppt模板
- Java数字转化为阿拉伯数字_Java实现中文数字转换为阿拉伯数字
- 微信服务器IP地址清单
- WSUS无法发现客户端
- plsql快速导入sql文件
- 2019软科计算机中国排名,权威发布:2019软科中国最好学科排名
- [Java] Comparator接口/compare方法的介绍与使用
- LTE网络中UU与X2接口研究
- w10不能访问网络计算机,win10系统无法访问局域网电脑的操作方法
- 【自动驾驶汽车技术 | 车载雷达系统】
- 在备份数据库过程中出现错误, 未能打开数据库‘msdb’, ‘msdb ‘ 数据库处于回避紧急模式!
- 如何在照片或者图片上增加文字
热门文章
- Java中,一切皆是对象——java中的对象类型与基本数据类型的区别
- hibernate_和ORM的关系
- 关于 Laravel Redis 多个进程同时取队列问题详解
- 后台(crontab,at,,nohup)
- python整数格式显示_[python之路]格式化显示
- 微信小程序点击button按钮后重置输入框等表单内容
- 用maya怎么做ak47_方铁做木纹用水性木纹漆怎么样?
- datagrip mysql乱码_DataGrip和IDEA无法连接上Mysql问题解决方法详解
- vue打包路径.html问题,如何解决vue.js打包报错问题
- 头部玩家指的是什么_MMO等级提升背后:如何设计经验,才能使玩家达成预期时间曲线?...