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

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

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

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

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

目录
相关文章
|
1天前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
3天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
3天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
2天前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
3天前
|
索引 Python
Python学习的自我理解和想法(5)
这是我在B站千锋教育学习Python的第五天笔记,主要内容包括列表的操作,如排序(`sort()`、``sorted()``)、翻转(`reverse()`)、获取长度(`len()`)、最大最小值(`max()`、``min()``)、索引(`index()`)、嵌套列表和列表生成(`range`、列表生成式)。通过这些操作,可以更高效地处理数据。希望对大家有所帮助!
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
159 9
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
29 1
|
19天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
42 5
|
1月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
1月前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。