【Python学习篇】Python实验小练习——高级数据结构(五)

简介: 【Python学习篇】Python实验小练习——高级数据结构(五)

一、实验目的

   

       掌握序列的基本操作

       掌握集合、字典的基本操作

二、实验环境

       联网计算机一台/每人,内装Windows 7以上操作系统和安装Python 3.7集成开发环境IDLE。

三、实验内容

       在本次实验内容中,我们将深入探讨并实践Python中的序列类型(列表和元组)以及集合和字典的基本操作技能,这包括学习如何对序列进行索引和切片以获取特定元素,如何向列表添加新元素以及删除现有元素,掌握列表排序的方法,同时也将涵盖集合的基本操作,如元素的添加和移除,以及执行集合的交、并、差集运算。此外,我们还会了解字典的使用,包括如何创建字典、访问和设置其键值对,进行键或值的获取,以及如何高效遍历字典中的所有元素。这些操作是Python编程中的基石,对任何希望精进数据处理技能的学习者来说都是必须掌握的技能。  

四、实验步骤和结果

       我们将首先通过创建不同类型的数据结构——列表、元组、集合和字典——来了解它们的基础特性和用法。我们将学习如何对列表和元组进行索引访问和切片操作,用以提取或更新序列中的特定数据段。接着,实验将指导我们如何在列表中添加或删除元素,并演示如何对列表内容进行排序。

        在集合的部分,实验将展示如何添加或移除集合中的元素,并实践运用集合的数学运算来探索不同集合之间的关系,如计算交集、并集和差集。

        最后,在探究字典的实验中,我们将练习如何动态地存取和更新键值对,学习如何删除字典中的项,以及如何利用循环语句高效地遍历字典的键和值。

        实验的结果应当是参与者能够熟练地运用这些基础数据结构来存储和处理数据,并能够将这些操作应用到更复杂的编程任务中。这些基本操作是进行数据分析、算法设计和日常编程问题解决时的核心技能。

4.1  列表实现。编写一个函数,生成随机密码,要求:

       (1)密码长度不小于8位,不大于16位

       (2)字符包括大小写字母和数字

思路:

       为了生成一个符合要求的随机密码,我们可以使用Python的random模块来选择随机字符,并且确保密码的长度介于8到16位之间。密码中的字符将从大小写字母和数字中选取。

       在这个函数中,我们首先定义了密码的最小和最大长度,然后创建了一个字符集合,该集合包含了大小写字母和数字。我们使用random.randint来确定密码的随机长度,它将返回一个8到16之间的整数。最后,我们通过random.choice在指定长度内随机选取字符来生成密码,并将这些字符连接成一个字符串。

       这段代码可以根据需要多次调用generate_random_password函数,生成多个随机密码。

代码实现:

import random
import string
 
def generate_random_password():
    # 密码长度范围
    min_length = 8
    max_length = 16
 
    # 可用的字符集合,包括大小写字母和数字
    characters = string.ascii_letters + string.digits
 
    # 随机选择一个密码长度
    password_length = random.randint(min_length, max_length)
 
    # 随机选择字符并生成密码
    password = ''.join(random.choice(characters) for i in range(password_length))
 
    return password
 
# 调用函数生成密码
password = generate_random_password()
print(password)

运行结果:

4.2  集合实例。删除5-1中生成的密码字符串中的重复字符,不改变原来的字符串顺序。

思路:

       如果要删除之前生成的密码字符串中的重复字符,同时不改变字符的原始顺序,在这个函数remove_duplicates_preserve_order中,我们遍历输入的字符串s,并使用一个集合seen来跟踪已经遇到的字符。如果字符还没有出现过,我们将它添加到seen集合和result列表中。最后,我们使用''.join(result)来将列表中的字符合并成一个新的字符串,这个新字符串就不包含任何重复的字符,同时保留了原始字符串中字符的顺序。

代码实现:

def remove_duplicates_preserve_order(s):
    seen = set()
    result = []
    for char in s:
        if char not in seen:
            seen.add(char)
            result.append(char)
    return ''.join(result)
 
# 假设我们之前生成的密码是以下字符串
password = "aAbBcCdD1234aAbBcC"
 
# 删除密码中的重复字符
password_no_duplicates = remove_duplicates_preserve_order(password)
print(password_no_duplicates)

运行结果:

4.3 字典实例。输入一段中英文字符串,统计每个字符出现的次数。

思路:

       要统计一个字符串中每个字符出现的次数,我们可以使用字典这一数据结构。字典是一个键值对集合,其中键是唯一的。对于这个任务,我们可以把字符作为键,该字符出现的次数作为值,我们定义了一个函数count_characters来统计字符串中每个字符的出现次数。我们使用一个for循环遍历字符串中的每个字符,并在字典char_count中记录它们的出现次数。最后,我们打印出每个字符及其计数。

代码实现:

def count_characters(s):
    # 初始化一个空字典来存储字符及其出现次数
    char_count = {}
 
    # 遍历输入字符串中的每个字符
    for char in s:
        # 如果字符在字典中,则增加其计数
        if char in char_count:
            char_count[char] += 1
        # 否则,将字符添加到字典中,并将其计数设置为1
        else:
            char_count[char] = 1
 
    # 返回包含字符计数的字典
    return char_count
 
# 输入的字符串,可以是任意的中英文混合字符串
input_string = "你好,Hello World!"
 
# 获得字符计数的字典
character_counts = count_characters(input_string)
 
# 打印字符及其出现次数
for char, count in character_counts.items():
    print(f"'{char}': {count}")

运行结果:

4.4 扩展1:数字重复统计。

       (1)随机生成1000个整数

       (2)数字范围[20,100]

       (3)升序输出所有不同的数字及每个数字重复的次数。

思路:

       使用随机数生成器生成1000个范围在20到100之间的整数。 用字典来统计每个数字出现的次数。 将字典转换为一个列表,列表中的每个元素都是一个包含数字和相应计数的元组。 按数字的升序对这个列表进行排序。 输出排序后的列表

代码实现:

import random
 
def generate_and_count_numbers(num_count, range_start, range_end):
    # 生成指定数量和范围的随机整数
    numbers = [random.randint(range_start, range_end) for _ in range(num_count)]
    
    # 统计每个数字出现的次数
    count_dict = {}
    for num in numbers:
        count_dict[num] = count_dict.get(num, 0) + 1
 
    # 将字典转换为列表,并按数字的升序排序
    sorted_count_list = sorted(count_dict.items())
 
    # 返回排序后的数字计数列表
    return sorted_count_list
 
# 设置参数:1000个整数,数字范围20到100
num_count = 1000
range_start = 20
range_end = 100
 
# 执行函数
sorted_count_list = generate_and_count_numbers(num_count, range_start, range_end)
 
# 打印输出
for num, count in sorted_count_list:
    print(f"数字 {num} 出现了 {count} 次。")

运行结果:

4.5 扩展2:输入一段英文字符串,将其按照手机上的9键输入规则转换位相应的数字,即abc-2,def-3,ghi-4,jkl-5,mno-6,pqrs-7,tuv-8,wxyz-9

思路:

       可以通过创建一个查找表来将每个英文字母映射到相应的数字,然后遍历输入的字符串,将每个字母替换为对应的数字来解决。

       首先定义了一个函数text_to_keypad,它接收一个字符串作为输入。在函数内部,它定义了一个映射表keypad_mapping,该表将每个英文字母映射到对应的数字键。然后,代码遍历输入字符串中的每个字符,并查找相应的数字来替换它。如果字符不是字母,它将被保留原样。最后,函数返回转换后的字符串。

代码实现:

def text_to_keypad(input_string):
    # 创建字母到数字的映射表
    keypad_mapping = {
        'a': '2', 'b': '2', 'c': '2',
        'd': '3', 'e': '3', 'f': '3',
        'g': '4', 'h': '4', 'i': '4',
        'j': '5', 'k': '5', 'l': '5',
        'm': '6', 'n': '6', 'o': '6',
        'p': '7', 'q': '7', 'r': '7', 's': '7',
        't': '8', 'u': '8', 'v': '8',
        'w': '9', 'x': '9', 'y': '9', 'z': '9',
    }
 
    # 遍历输入的字符串,将每个字母转换为对应的数字
    output = ''
    for char in input_string.lower():  # 转换为小写以匹配映射表
        if char in keypad_mapping:
            output += keypad_mapping[char]  # 替换为对应数字
        else:
            output += char  # 不是字母的字符保持不变
 
    return output
 
# 示例输入
input_text = "Hello World!"
print(text_to_keypad(input_text))  # 打印转换后的数字序列

运行结果:

五、总结

5.1 实验过程中的问题及解决方法:

       在这个特定的实验中,问题是从一个含有重复字符的字符串中删除重复的字符,同时保持剩余字符的原始顺序。在Python中,字符串是不可变的序列,这意味着我们不能直接修改字符串中的字符。因此,为了解决这个问题,我们需要采用一种方法来创建一个新的字符串,其中包含原始字符串中的唯一字符,且顺序不变。

       解决方法为:遍历原始字符串中的每个字符。对于每个字符,检查它是否已经在集合中了。如果字符不在集合中,将其添加到集合和结果字符串中。如果字符已经在集合中,则忽略它,继续下一个字符。遍历完成后,返回新构建的结果字符串,它将不包含重复的字符。

5.2 实验收获

        我们使用了集合(set)数据结构,因为它能够高效地处理重复性问题,并且可以快速判断某个元素是否已经存在于集合中,我们学习了如何在去除重复元素的同时保持原始顺序,这在实际编程中非常有用,因为很多情况下元素的顺序是有意义的, 字符串在Python中是不可变的,这意味着不能直接修改它们,要改变字符串,必须创建一个新的字符串,解决问题的过程锻炼了算法思维,我们不仅要考虑如何解决问题,还要考虑解决问题的效率,过程中,我们学习了字符串遍历、集合操作和字符串拼接等Python编程的基本技巧, 实验鼓励我们思考如何编写既高效又易于理解的代码。

📝大佬觉得本文有所裨益,不妨轻点一下👍给予鼓励吧!

❤️❤️❤️本人虽努力,但能力尚浅,若有不足之处,恳请各位大佬不吝赐教,您的批评指正将是我进步的动力!😊😊😊

💖💖💖若您认为此篇文章对您有所帮助,烦请点赞👍并收藏🌟,您的支持是我前行的最大动力!

🚀🚀🚀任务在默默中完成,价值在悄然间提升。让我们携手共进,一起加油,迎接更美好的未来!🌈🌈🌈

目录
相关文章
|
21天前
|
机器学习/深度学习 测试技术 数据处理
KAN专家混合模型在高性能时间序列预测中的应用:RMoK模型架构探析与Python代码实验
Kolmogorov-Arnold网络(KAN)作为一种多层感知器(MLP)的替代方案,为深度学习领域带来新可能。尽管初期测试显示KAN在时间序列预测中的表现不佳,近期提出的可逆KAN混合模型(RMoK)显著提升了其性能。RMoK结合了Wav-KAN、JacobiKAN和TaylorKAN等多种专家层,通过门控网络动态选择最适合的专家层,从而灵活应对各种时间序列模式。实验结果显示,RMoK在多个数据集上表现出色,尤其是在长期预测任务中。未来研究将进一步探索RMoK在不同领域的应用潜力及其与其他先进技术的结合。
60 4
|
2月前
|
程序员 测试技术 开发工具
豆瓣评分7.9!世界级讲师耗时5年整理出的Python学习手册!
Python是一门流行的开源编程语言,广泛用于各个领域的独立程序与脚本化应用中。它不仅免费、可移植、功能强大,同时相对简单,而且使用起来充满乐趣。从软件业界的任意一角到来的程序员,都会发现Python着眼于开发者的生产效率以及软件质量,因此无论你的项目是大还是小,选择Python都将带来战略性的优势。 今天给小伙伴们分享的这份手册讲述了完整的Python语言,力争满足“语言”和“原理”两个方面的需求,并拥有足够的深度以便实用。废话不多说,下面展示给大家。
|
2月前
|
数据采集 数据可视化 Ruby
GitHub星标破万!Python学习教程(超详细),真的太强了!
Python 是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间和精力。 Python 的设计哲学之一就是简单易学,体现在两个方面: 1. 语法简洁明了:相对 Ruby 和 Perl,它的语法特性不多不少,大多数都很简单直接,不玩儿玄学。 2. 切入点很多:Python 可以让你可以做很多事情,科学计算和数据分析、爬虫、Web 网站、游戏、命令行实用工具等等等等,总有一个是你感兴趣并且愿意投入时间的。
|
2月前
|
算法 数据挖掘 大数据
深入学习Python的性能优化
【8月更文挑战第9天】深入学习Python性能优化涵盖设定明确目标、运用timeit与cProfile等工具诊断瓶颈、优化代码结构与算法、采用并行/并发技术、利用生成器与第三方库等策略。这是一个持续学习的过程,旨在全面提升代码效率与响应速度。
30 1
|
2月前
|
存储 JSON 测试技术
Python中最值得学习的第三方JSON库
Python中最值得学习的第三方JSON库
|
2月前
|
数据采集 数据挖掘 数据处理
解锁Python数据分析新技能!Pandas实战学习,让你的数据处理能力瞬间飙升!
【8月更文挑战第22天】Python中的Pandas库简化了数据分析工作。本文通过分析一个金融公司的投资数据文件“investment_data.csv”,介绍了Pandas的基础及高级功能。首先读取并检查数据,包括显示前几行、列名、形状和数据类型。随后进行数据清洗,移除缺失值与重复项。接着转换日期格式,并计算投资收益。最后通过分组计算平均投资回报率,展示了Pandas在数据处理与分析中的强大能力。
36 0
|
3天前
|
算法 安全 测试技术
golang 栈数据结构的实现和应用
本文详细介绍了“栈”这一数据结构的特点,并用Golang实现栈。栈是一种FILO(First In Last Out,即先进后出或后进先出)的数据结构。文章展示了如何用slice和链表来实现栈,并通过golang benchmark测试了二者的性能差异。此外,还提供了几个使用栈结构解决的实际算法问题示例,如有效的括号匹配等。
golang 栈数据结构的实现和应用
01_设计一个有getMin功能的栈
01_设计一个有getMin功能的栈
|
3天前
|
前端开发
07_用队列实现栈
07_用队列实现栈
06_用栈来求解汉诺塔问题
06_用栈来求解汉诺塔问题
下一篇
无影云桌面