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

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

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

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

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

目录
相关文章
|
7天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
102 66
|
18天前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
9天前
|
Python
Python学习的自我理解和想法(10)
这是我在千锋教育B站课程学习Python的第10天笔记,主要学习了函数的相关知识。内容包括函数的定义、组成、命名、参数分类(必须参数、关键字参数、默认参数、不定长参数)及调用注意事项。由于开学时间有限,记录较为简略,望谅解。通过学习,我理解了函数可以封装常用功能,简化代码并便于维护。若有不当之处,欢迎指正。
|
11天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
49 20
|
20天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
20天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
18天前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
29天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!

热门文章

最新文章