5 推导数据:处理数据、格式、编码、解码、排序

  处理数据:从Head First Python 上下载资源文件,即:james.txt,julie.txt,mikey.txt,sarah.txt。

  实例一:打开以上文件,将数据提取到列表中

>>> with open('james.txt') as jaf:
data = jaf.readline()
james = data.strip().split(',')
with open('julie.txt')as juf:
data = juf.readline()
julie = data.strip().split(',') >>> print(james)
['2-34', '3:21', '2.34', '2.45', '3.01', '2:01', '2:01', '3:10', '2-22']
>>> print(julie)
['2.59', '2.11', '2:11', '2:23', '3-10', '2-23', '3:10', '3.21', '3-21']
>>> with open('mikey.txt')as mif:
data = mif.readline()
mikey = data.strip().split(',')
with open('sarah.txt')as saf:
data = saf.readline()
sarah = data.strip().split(',') >>> print(mikey)
['2:22', '3.01', '3:01', '3.02', '3:02', '3.02', '3:22', '2.49', '2:38']
>>> print(sarah)
['2:58', '2.58', '2:39', '2-25', '2-55', '2:54', '2.18', '2:55', '2:55']

  data.strip().split(','),这种形式的代码段叫方法串链(method chaining)。

  第一个方法strip()应用到data中的数据行,这个方法会去除字符串中不想要的空白符;

  第二个方法split(',')会创建一个列表;

  采用这种方法可以把多个方法串链接在一起,生成所需要的结果。从左到右读。

  排序:有两种方式

    一、原地排序(In-plice sorting)

      使用sort()方法,新生成的数据会替代原来的数据;

    二、复制排序(Copied sorting)

      保留原来的数据,然后新生成一个排序后的数据;

>>> data2=[6,3,1,2,4,5]
>>> data2
[6, 3, 1, 2, 4, 5]

>>> sorted(data2)
[1, 2, 3, 4, 5, 6]
>>> data2
[6, 3, 1, 2, 4, 5]
>>> data3=sorted(data2)
>>> data3
[1, 2, 3, 4, 5, 6]
>>> data1=[2,4,6,5,1,3]
>>> data1.sort()
>>> data1
[1, 2, 3, 4, 5, 6]

  使用print(sorted(data))来输出之前的james,julie,mikey,sarah列表,如下:

>>> print(sorted(james))
['2-22', '2-34', '2.34', '2.45', '2:01', '2:01', '3.01', '3:10', '3:21']
>>> print(sorted(julie))
['2-23', '2.11', '2.59', '2:11', '2:23', '3-10', '3-21', '3.21', '3:10']
>>> print(sorted(mikey))
['2.49', '2:22', '2:38', '3.01', '3.02', '3.02', '3:01', '3:02', '3:22']
>>> print(sorted(sarah))
['2-25', '2-55', '2.18', '2.58', '2:39', '2:54', '2:55', '2:55', '2:58']

  会发现,排序并不正确,目标是从左到右,从小到大。

  仔细看,发现有'-',':','.'这些符号,因为符号不统一,所以会影响排序。

  接下来,创建一个函数,名为:sanitize(),作用是:从各个选手的列表接收一个字符串,

  然后处理这个字符串,将找到的'-'和':'替换为'.'并返回清理过的字符串,此外如果字符串

  本身已经包含'.',那么就不需要在做清理工作了。

    函数代码如下:

>>> def sanitize(time_string):
    if'-'in time_string:
      splitter='-'
    elif ':'in time_string:
      splitter=':'
    else:
      return(time_string)
    (mins,secs)=time_string.split(splitter)
    return(mins+'.'+secs)

    实例二:接下来实现正确排序上面四个文件生成的列表

>>> with open('james.txt') as jaf:
data = jaf.readline()
james=data.strip().split(',')
with open('julie.txt')as juf:
data = juf.readline()
julie=data.strip().split(',')
with open('mikey.txt')as mif:
data = mif.readline()
mikey=data.strip().split(',')
with open('sarah.txt')as saf:
data = saf.readline()
sarah=data.strip().split(',')
clean_james=[]
clean_julie=[]
clean_mikey=[]
clean_sarah=[]
for each_t in james:
clean_james.append(sanitize(each_t))
for each_t in julie:
clean_julie.append(sanitize(each_t))
for each_t in mikey:
clean_mikey.append(sanitize(each_t))
for each_t in sarah:
clean_sarah.append(sanitize(each_t)) >>> print(clean_james)
['2.34', '3.21', '2.34', '2.45', '3.01', '2.01', '2.01', '3.10', '2.22']
>>> print(clean_julie)
['2.59', '2.11', '2.11', '2.23', '3.10', '2.23', '3.10', '3.21', '3.21']
>>> print(clean_mikey)
['2.22', '3.01', '3.01', '3.02', '3.02', '3.02', '3.22', '2.49', '2.38']
>>> print(clean_sarah)
['2.58', '2.58', '2.39', '2.25', '2.55', '2.54', '2.18', '2.55', '2.55']

  重新排序如下: 

>>> print(sorted(clean_james))
['2.01', '2.01', '2.22', '2.34', '2.34', '2.45', '3.01', '3.10', '3.21']
>>> print(sorted(clean_julie))
['2.11', '2.11', '2.23', '2.23', '2.59', '3.10', '3.10', '3.21', '3.21']
>>> print(sorted(clean_mikey))
['2.22', '2.38', '2.49', '3.01', '3.01', '3.02', '3.02', '3.02', '3.22']
>>> print(sorted(clean_sarah))
['2.18', '2.25', '2.39', '2.54', '2.55', '2.55', '2.55', '2.58', '2.58']

  推导列表       

>>> print(sorted([sanitize(t)for t in james]))
['2.01', '2.01', '2.22', '2.34', '2.34', '2.45', '3.01', '3.10', '3.21']
>>> print(sorted([sanitize(t)for t in julie]))
['2.11', '2.11', '2.23', '2.23', '2.59', '3.10', '3.10', '3.21', '3.21']
>>> print(sorted([sanitize(t)for t in mikey]))
['2.22', '2.38', '2.49', '3.01', '3.01', '3.02', '3.02', '3.02', '3.22']
>>> print(sorted([sanitize(t)for t in sarah]))
['2.18', '2.25', '2.39', '2.54', '2.55', '2.55', '2.55', '2.58', '2.58']

  Python的列表推导是这种语言支持函数编程概念的一个例子。

  列表推导的妙处:通过使用列表推导可以大幅减少需要维护的代码。

  迭代删除重复项:

>>> unique_james=[]
>>> for each_t in james:
    if each_t not in unique_james:
      unique_james.append(each_t)

      >>> print(unique_james[0:3])
          ['2-34', '3:21', '2.34']

        通过not in操作符来滤除列表中的重复项。

  用集合删除重复项:

      通过set()可以创建一个新的集合,属于“工厂函数”,用于创建某种类型的新的数据项。  

  重新定义函数,精简代码,将数据返回代码前完成分解/去除空白符处理。

      

>>> unique_james=[]
>>> for each_t in james:
if each_t not in unique_james:
unique_james.append(each_t) >>> print(unique_james[0:3])
['2-34', '3:21', '2.34']
>>> def get_coach_data(filename):
try:
with open(filename)as f:
data=f.readline()
return(data.strip().split(','))
except IOError as ioerr:
print('File error: '+ str(ioerr))
return(None) >>> sarah1 = get_coach_data('sarah.txt')
>>> print(sorted(set([sanitize(t)for t in james]))[0:3])
['2.01', '2.22', '2.34']

>>> print(sarah1)
['2:58', '2.58', '2:39', '2-25', '2-55', '2:54', '2.18', '2:55', '2:55']
>>> print(sorted(set([sanitize(t)for t in sarah1]))[0:3])
['2.18', '2.25', '2.39']

  函数串链:如 print(sorted(set([sanitize(t)for t in sarah1]))[0:3]),需要从右往左读,和方法串链正好相反。

  本质上是一堆函数的嵌套操作。

  总结

    Python术语:1原地排序:转换然后替换;

            2复制排序:转换然后返回;

            3方法串链:对数据应用一组方法;

            4函数串链:对数据应用一组函数;

            5列表推导:在一行上指定一个转换;

            6分片:从一个列表,访问多个列表项;

            7集合:一组无需的数据项,其中不包含重复项。

    具体方法:1 sort():原地排序;

         2 sorted():复制排序;

         3 对于以下代码:

           new=[]

          for t in old:

            new.append(len(t))

          可以用列表推导代替:new=[len(t) for t in old];

         4 分片:使用my_list[3:6]可以访问列表my_list从索引位置3到索引位置6的列表数据项;         

         5 使用set()工厂方法可以创建一个集合。

------------------------------------------------The End of Fifth Chapter------------------------------------------------

Python(Head First)学习笔记:五的更多相关文章

  1. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  2. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

  3. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  4. Requests:Python HTTP Module学习笔记(一)(转)

    Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...

  5. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  6. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  7. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Python Built-in Function 学习笔记

    Python Built-in Function 学习笔记 1. 匿名函数 1.1 什么是匿名函数 python允许使用lambda来创建一个匿名函数,匿名是因为他不需要以标准的方式来声明,比如def ...

  10. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. Netty学习(三)-Netty重要接口讲解

    上一节我们写了一个HelloWorld,对于Netty的运行有了一定的了解,知道Netty是如何启动客户端和服务器端.这一节我们简要的讲解一下几个重要的接口,初步探讨Netty的运行机制,当然刚学Ne ...

  2. 基于SMS短信平台给手机发送短信

    JAVA发送手机短信,我知道的有三种方式,恰逢项目需求,自己整理了基于SMS的短信发送,其他两种这里就说说一下 使用webservice接口发送手机短信,这个可以使用sina提供的webservice ...

  3. javaWeb 中前端Form表单数据处理(手动拼json)

    在前端我们会用到最多的就是form表单提交数据,在form表单中有很多都是自动将数据传到后台,然后通过实体来接受的,但是有的时候我们就是需要在前端就拿到这个Form表单的数据,这是我们就可以自己讲数据 ...

  4. JavaScript数据结构——图的实现

    在计算机科学中,图是一种网络结构的抽象模型,它是一组由边连接的顶点组成.一个图G = (V, E)由以下元素组成: V:一组顶点 E:一组边,连接V中的顶点 下图表示了一个图的结构: 在介绍如何用Ja ...

  5. 构建企业级数据湖?Azure Data Lake Storage Gen2不容错过(上)

    背景 相较传统的重量级OLAP数据仓库,“数据湖”以其数据体量大.综合成本低.支持非结构化数据.查询灵活多变等特点,受到越来越多企业的青睐,逐渐成为了现代数据平台的核心和架构范式. 数据湖的核心功能, ...

  6. 如何利用jenkins插件查看allure报告-----完整篇(解决404和无数据问题)

    背景: python3+appium+pytest+allure写了安卓的自动化脚本,在windows本机pycharm上跑通过后生成了allure报告.  公司jenkins搭建在linux服务器上 ...

  7. spring-boot-plus集成Spring Boot Admin管理和监控应用(十一)

    spring-boot-plus集成Spring Boot Admin管理和监控应用 spring boot admin Spring Boot Admin用来管理和监控Spring Boot应用程序 ...

  8. js 设计模式&&query

    1. 语法: try{           //需要执行的代码      }catch(e){           //错误处理 e程序遇到错误时的报错信息      } 2.惰性函数: 函数在第一次 ...

  9. Eclipse中安装JRebel热部署教程

    Eclipse中安装JRebel热部署教程 前言        Eclipse安装JRebel插件可快速实现热部署,节省了大量重启时间,提高开发效率. 本文只介绍Eclipse安装JRebel插件版本 ...

  10. Oracle数据库之四 简单查询

    四.简单查询 ​ 简单查询的主要特征就是将一张数据表之中的全部数据行进行显示,而后可以利用 SELECT 子句来控制所需要的输出列. 4.1.基础语法 范例:查询 emp 表中的数据(全部数据查询) ...