【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编程的基本技巧, 实验鼓励我们思考如何编写既高效又易于理解的代码。

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

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

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

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

目录
相关文章
|
19小时前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
19小时前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
23小时前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
19小时前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22小时前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
19小时前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
23小时前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
23小时前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构的基本概念;算法的基本概念、特性以及时间复杂度、空间复杂度等举例说明;【含常见的报错问题及其对应的解决方法】
|
20小时前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
13天前
|
机器学习/深度学习 人工智能 架构师
Python学习圣经:从入门到精通Python,打好 LLM大模型的基础
Python学习圣经:从0到1精通Python,打好AI基础