Python程序设计 实验4:字典、集合的应用

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: Python程序设计 实验4:字典、集合的应用

1. 列表与集合:


参考exp4.1.py,比较列表和集合在一些操作上所需要时间的差别。

分析:

首先创建列表和集合,并获取开始时间,再检查一个元素是否在集合或列表内。再获取结束时间,两时间做差即为程序运行的消耗时间,将运行时间输出即可。

同理也可测得删除元素的时间。


编程并实现:

   import time  
# 代码1:创建列表  
list1 = []  
for i in range(0, 10**8):  
    list1.append(i)  
# 代码2:创建集合  
set1 = set()  
for i in range(0, 10**8):  
    set1.add(i)  
startTime = time.time()  # 开始时间  
# 代码3:检查一个元素是否在一个集合里  
flag = 8*10**7 in set1  
endTime = time.time()  # 结束时间  
runTime = float((endTime - startTime) * 1000)  
# 代码4:输出结果  
print("Time cost for check items in set:")  
print(runTime)  
startTime = time.time()  # 开始时间  
# 代码5:检查一个元素是否在一个列表里  
flag = 8*10**7 in list1  
endTime = time.time()  # 结束时间  
runTime = float((endTime - startTime) * 1000)  
# 代码6:输出结果  
print("Time cost for check items in list:")  
print(runTime)  
# 代码7:仿照上面例子,测试集合与列表中删除元素在时间上的差别  
startTime = time.time()  # 开始时间  
list1.remove(8*10**7)  
endTime = time.time()  # 结束时间  
runTime = float((endTime - startTime) * 1000)  
print("Time cost for delete items in list:")  
print(runTime)  
startTime = time.time()  # 开始时间  
set1.remove(8*10**7)  
endTime = time.time()  # 结束时间  
runTime = float((endTime - startTime) * 1000)  
print("Time cost for delete items in set:")  
print(runTime)  

由于小数据量级下时间消耗较短,小于时间测量函数的精度,因此需要选择较大数据进行测试。因此本实验中选择了1 0 8 10^810

8

作为数据量级。首先创建列表与集合。分别进行大数据下的创建赋值。并选择查找较大数据进行测验。最后删除数据完成对结果进行测验。

运行并测试:

def9184cdbef409c80b5f688ae5c0b6e.png

可以发现,对元素查找与删除时,集合所消耗的时间均远小于列表所需时间。


2. 统计关键字


统计文本 ofdm_tx_main.py中Python关键字出现的次数。关键字包括


“and”, “as”, “assert”, “break”, “class”, “continue”, “def”, “del”, “elif”, “else”, “except”, “False”, “finally”, “for”, “from”, “global”, “if”, “import”, “in”, “is”, “lambda”, “None”, “nonlocal”, “not”, “or”, “pass”, “raise”, “return”, “True”, “try”, “while”, “with”, “yield”


小提示:

可使用以下函数删除文本中的标点符号,即把标点符号变成" ",


import string
def removePunctuations(word): 
    for ch in word:
        if ch in string.punctuation:
            word = word.replace(ch, " ")
    return word


分析:

首先创建关键字字典用于统计每个出现的关键词次数。

然后按行读入文件,并对输入流文件进行判断,如果为空行则进行下一行的处理,如果为EOF结束符,则结束处理。

对于每个读入的行,首先将标点符号修改为空格。再利用split对每个单词完成切分,并存放在一个列表中。再次遍历列表去除空字符串和换行符后,将列表中每个字符串与建立字典中键值一一对应,如果存在则键值所指的值加一。循环处理所有文件后输出结果字典即可。

编程并实现:


import string  
# 去除标点空格以及换行  
def removePunctuations(word):  
    # 去除标点符号  
    for ch in word:  
        if ch in string.punctuation or ch == '\n':  
            word = word.replace(ch, " ")  
    # 利用空格完成切分  
    temp = word.split(' ')  
    # 倒序查找空列表或仅有换行列表并丢弃  
    for i in range(len(temp)-1, -1, -1):  
        # 判空  
        if len(temp[i]) == 0:  
            del temp[i]  
            continue  
        # 判换行  
        if temp[i] == '\n':  
            del temp[i]  
    return temp  
# 建立关键字字典  
word_dic = {"and": 0, "as": 0, "assert": 0, "break": 0, "class": 0, "continue": 0, "def": 0, "del": 0, "elif": 0, "else": 0, "except": 0, "False": 0, "finally": 0, "for": 0, "from": 0, "global": 0,  
            "if": 0, "import": 0, "in": 0, "is": 0, "lambda": 0, "None": 0, "nonlocal": 0, "not": 0, "or": 0, "pass": 0, "raise": 0, "return": 0, "True": 0, "try": 0, "while": 0, "with": 0, "yield": 0}  
# 读入文件  
inputFile = open("ofdm_tx_main.py", "r")  
# 循环进行处理  
while True:  
    # 按行读入  
    line = inputFile.readline()  
    if not line:  
        break  
    if line == '\n':  
        continue  
    # 对非空行进行处理  
    wordlist = removePunctuations(line)  
    for temp in wordlist:  
        if temp in word_dic.keys():  
            word_dic[temp] += 1  
print(word_dic)  
inputFile.close()  


①定义去除标点空格的函数,利用replace完成将标点符号替换成空格的操作。其次,利用空格和换行符对读入的行完成切分。再对每个切分字符串进行判断,如果为空或换行,则删除。

②定义关键字字典,完成对各个关键字的匹配计数。

③通过输入流读入整个文件,并利用循环依次处理每一行。如果读入的为换行符,则继续读入下一行。如果读入的是EOF结束符,则结束读取。其余情况则为读入有效字符,进行下一步处理。

④对于每个有效读入行,先调用定义的函数对空格以及标点等进行处理并存入列表中。遍历列表的每一项,如果在所创建的字典键值中,则对应计数值加一,否则继续下一个有效读入的处理。

⑤完成所有的处理后输出结果。

运行并测试:


7b135ada70ab478cbd7a1ed88acdfc5e.png

{‘and’: 3, ‘as’: 0, ‘assert’: 0, ‘break’: 0, ‘class’: 3, ‘continue’: 0, ‘def’: 9, ‘del’: 0, ‘elif’: 2, ‘else’: 7, ‘except’: 1, ‘False’: 6, ‘finally’: 0, ‘for’: 3, ‘from’: 6, ‘global’: 1, ‘if’: 17, ‘import’: 8, ‘in’: 5, ‘is’: 2, ‘lambda’: 1, ‘None’: 4, ‘nonlocal’: 0, ‘not’: 3, ‘or’: 1, ‘pass’: 1, ‘raise’: 1, ‘return’: 2, ‘True’: 6, ‘try’: 1, ‘while’: 2, ‘with’: 0, ‘yield’: 0}


3. 统计电话号码中的数字出现次数


编写函数 NumberFrequencies(tel_num), tel_num 为 区号-电话号码 格式(如 0755-26536114),返回一个字典保存数字0~9 出现的次数,字典的键为数字,值为数字出现的次数。

分析:

首先创建关键字字典用于统计每个出现的关键词次数。

然后获取输入,并设置标志变量用于忽略掉区号中的数字,只统计电话号码中的数字。最后将电话号码的每一位存入字典中,全部程序运行完毕后输出结果即可。

编程并实现:


# 定义统计函数  
def NumberFrequencies(tel_num):  
    # 忽略掉连接符前的数字  
    flag = False  
    for i in range(0, len(tel_num)):  
        if not flag and tel_num[i] == '-':  
            flag = True  
            continue  
        if not flag:  
            continue  
        # 对应字典值加一  
        word_dic[tel_num[i]] += 1  
# 建立关键字字典  
word_dic = {str(i): 0 for i in range(0,10)}  
str = input("Please input the telephone number:")  
NumberFrequencies(str)  
print(word_dic)  

①定义统计函数,获取输入的电话号之后,从头依次进行判断,设置一标志变量用于存是否读到分隔符。

②如果未读到分隔符则将一直读入,直到读入分隔符。读入分隔符后便将对应字典值加一直至处理完毕。

③处理完后即输出完整字典

运行并测试:

运行程序,并输入“0755-26536114”


31117c0eef214a6cb80715e614680828.png


{‘0’: 0, ‘1’: 2, ‘2’: 1, ‘3’: 1, ‘4’: 1, ‘5’: 1, ‘6’: 2, ‘7’: 0, ‘8’: 0, ‘9’: 0}


4. 字典的理解:


回答以下问题

(1)以下哪些字典创建是有效的,哪些是无效的?解释原因。


d = {[1, 2]:1, [3, 4]:3}
d = {(1, 2):1, (3, 4):3}
d = {{1, 2}:1, {3, 4}:3}
d = {"12":1, "34":3}

分析:

通过实际运行并分析可以得到相应结果如下:

①d = {[1, 2]:1, [3, 4]:3}

无效,因为字典的键必须为可哈希对象。列表不可哈希。

②d = {(1, 2):1, (3, 4):3}

有效。每个元组为对应的键。

③d = {{1, 2}:1, {3, 4}:3}

无效,因为字典的键必须为可哈希对象。集合不可哈希。

④d = {“12”:1, “34”:3}

有效。每个字符串为对应的键。


(2)基于以下代码,回答问题:

D={"what":22, "are":11, "you":14, "doing":5, "next":9, "Saturday?":4}
sum1 = []
sum2 = 0
for x in D.items():
sum1 = 【代码 1】
sum2 = 【代码 2】

问题 1: 如果 sum1 为

[(‘what’, 22), (‘are’, 11), (‘you’, 14), (‘doing’, 5), (‘next’, 9), (‘Saturday?’, 4)],

那么【代码 1】应该是什么?

分析:

即将字典转换为对应列表,可以通过调用系统函数完成。因此可以填入如下代码:


sum1 = list(D.items())

问题 2: 如果【代码 2】分别是

(a) sum2 = sum2 + D[x[0]]

(b) sum2 = sum2 + x[1]

sum2的结果分别是什么?

分析:

都输出65。

a通过访问键值对对应值进行访问并求和。b通过直接访问值进行求和。故最后输出均为65


5. 堆的理解


描述课件中函数 heapreplace弹出堆中最小元素,同时插入新元素时,堆的变化过程(可手写拍照)。

分析:

即将堆顶元素替换为6后进行重新调整,具体过程见下。


9bf5f40752d54ca9a514e4364ec8830c.png


实验结论


通过本次对字典与集合的应用,我学会并掌握了字典与集合操作上的异同,并学会了字典与集合的基本操作,学会了使用字典完成关键字的匹配等操作。

此外我也学习了堆等高级数据结构,并对如何进行堆排序的调整进行了练习。在本次实验过程中,我有如下两个启示:


测量较小运行时间时,可以通过运行较大数据或执行多次重复操作来延长运行时间来“以大见小”以完成测量。

输入时输入的一般为字符型,当需要存入字典时需注意字符型与整形的转换。


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
3天前
|
人工智能 安全 Java
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
23 7
|
13天前
|
数据库 Python
Python 应用
Python 应用。
34 4
|
2天前
|
机器人 计算机视觉 Python
Python作为一种高效、易读且功能强大的编程语言,在教育领域的应用日益广泛
Python作为一种高效、易读且功能强大的编程语言,在教育领域的应用日益广泛
16 5
|
13天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
14天前
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
33 1
|
6月前
|
存储 Python
python字典中删除键值的方法
python字典中删除键值的方法
159 0
|
Python
python知识点100篇系列(8)-字典去重复的几种方法
python知识点100篇系列(8)-字典去重复的几种方法
318 1
|
6月前
|
存储 JSON JavaScript
Python字典和JSON字符串相互转化方法
【2月更文挑战第18天】
211 3
|
2月前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
137 4
|
3月前
|
存储 Python 容器
python字典的常用操作方法
python字典的常用操作方法
下一篇
无影云桌面