《Head First Python》学习笔记 Chapter5:数据处理

本章的目的是学习简单的数据处理,首先给出了一些文本数据,需要将这些文本数据读取,并转换为列表,然后对列表中的数据进行统一格式化,最后进行排序。

本章所需的数据获取地址:获取数据

数据处理

未优化的代码

# 对时间字符串进行格式化,统一形式为mins.secs
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(sorted(clean_james))
print(sorted(clean_julie))
print(sorted(clean_mikey))
print(sorted(clean_sarah))
---------臃肿的部分------------

优化的代码

def sanitize(time_str):
    if '-' in time_str:
        spliter = '-'
    elif ':' in time_str:
        spliter = ':'
    else:
        return time_str
    (mins, secs) = time_str.split(spliter)
    return(mins + '.' + secs)

# 将读取文件的代码抽取成函数
def get_coach_data(filename):
    try:
        with open(filename) as file:
            data = file.readline();
        return data.strip().split(',')
    except IOError as err:
        print('File error:' + str(err))
        return None

# 去除列表中的重复数据
def clean_data(data):
    clean_data = []
    for item in data:
        if item not in clean_data:
            clean_data.append(item)
    return clean_data

james = get_coach_data('james.txt')
julie = get_coach_data('julie.txt')
mikey = get_coach_data('mikey.txt')
sarah = get_coach_data('sarah.txt')

james_format = [sanitize(data) for data in james]
julie_format = [sanitize(data) for data in julie]
mikey_format = [sanitize(data) for data in mikey]
sarah_format = [sanitize(data) for data in sarah]

clean_james = clean_data(james_format)
clean_julie = clean_data(julie_format)
clean_mikey = clean_data(mikey_format)
clean_sarah = clean_data(sarah_format)

print(sorted(clean_james)[0:3])
print(sorted(clean_julie)[0:3])
print(sorted(clean_mikey)[0:3])
print(sorted(clean_sarah)[0:3])

两种排序方法

原地排序(In-place sorting):data.sort()

该方法会对排列数据(data)按指定的顺序进行排序,然后用排好顺序的数据替换掉原有的数据,因此原有的数据顺序会丢失。

复制排序(Copied sorting):sorted(data)

对数据按指定的顺序进行排序,然后返回原数据的一个有序副本。原数据依然保留,只是对副本进行排序

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


>>> data.sort() # 对数据进行原地排序
>>> data
[1, 2, 3, 4, 5, 6] # 原数据的顺已经改变
>>> 
>>> data = [6,3,1,2,5,4]
>>> data_sort = sorted(data) # 对数据进行复制排序,返回一个有序副本
>>> data
[6, 3, 1, 2, 5, 4] # 原数据顺序仍然存在


>>> data_sort
[1, 2, 3, 4, 5, 6]

列表推导式(list comprehension)

使用方法

[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]

使用示例

# 将分钟数转化成秒数
>>> mins = [1,2,3]
>>> secs = [m * 60 for m in mins]
>>> secs
[60, 120, 180]

# 求列表中数字的平方
>>> data = [1,2,3,4]
>>> data_square = [num * num for num in data]
>>> data_square
[1, 4, 9, 16]

# 还可以跟其他条件,对列表中的数据进行筛选处理
>>> result = [num * 2 for num in data if num > 2]
>>> result
[6, 8]

# 也可以增加更多的for语句的部分:
>>> result = [[x,y] for x in range(2) for y in range(2)]
>>> result
[[0, 0], [0, 1], [1, 0], [1, 1]]
>>> 

Set:无序、不可重复

初始化

1.创建一个空的set

distances = set()

2.为set提供一个数据列表(需要用大括号包围

>>> distances = {10.6,11,8,10.6,"two",7}
>>> distances
{8, 10.6, 11, 'two', 7} # 自动过滤掉了重复的数据

3.为set指定一个现有的列表

>>> list = [2,2,3,5,6]
>>> distances = set(list)
>>> distances
{2, 3, 5, 6}

零碎知识点

list列表分片

列表分片主要用于获取列表的一个子部分,即通过L[x:y]取得并返回列表L在偏移量x到y(包括x不包括y)之间的一个新列表,如下所示:

>>> [1,2,3,4,5,6][2:5]
[3, 4, 5]

另外,如果偏移量留空,则第一个偏移量默认为列表的头部,第二个默认为末尾:

>>> [1,2,3,4,5,6][:]
[1, 2, 3, 4, 5, 6]

如果这样做,相当于对原列表做一个浅拷贝。

分片实际还接收第三个参数,其代表步长,默认情况下,该值为1。下面将步长改为2:

>>> [1,2,3,4,5,6][::2]
[1, 3, 5]

如果把步长设为负值会有什么效果呢?

>>> [1,2,3,4,5,6][::-2]
[6, 4, 2]

相当于反转了列表,从列表的尾部开始遍历。

工厂函数

工厂函数用于创建某种类型的新的数据项,例如set()就是一个工厂函数,因为它会创建一个新的集合。


如果觉得有用,欢迎关注我的微信,有问题可以直接交流:

你的关注是对我最大的鼓励!
你的关注是对我最大的鼓励!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,670评论 0 11
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,835评论 6 13
  • 一、实验目的 学习使用 weka 中的常用分类器,完成数据分类任务。 二、实验内容 了解 weka 中 explo...
    yigoh阅读 8,379评论 5 4
  • 斑驳的印痕至今还清晰的留在那里,砖墙上你的名字依旧还在。那残阳如血映红了半边天,如今我们都四散而去。外面的世界虽说...
    _Dtath阅读 315评论 0 2
  • 房价已经高过天了,不过它还是如雨后春笋,一路高歌猛进。 高到了什么程度呢,高到一个普通人需要二三十年不吃不喝才能拥...
    致远投资黄绍国阅读 308评论 0 0