Python程序设计 实验3:列表、元组的应用(下)

简介: Python程序设计 实验3:列表、元组的应用

4、模式识别-四个连续相等的数字


编写函数 isconsecurivefour(list1),用于测试列表 list1 中是否有四个连续相等的数字。编写测试程序,提示用户输入一系列整数,返回 True/False,表示是否包含四个连续相等的数字。


(1)基本思路


依次查找当前值是否与标记值相等,如果相等则计数器加一,如果不相等则计数器清零并查找下一个。直至将所有元素查找完毕,如果计数器在查找过程中存在等于4的时刻,则返回True,否则返回False。


(2)编程实现


# 定义函数  
def isconsecurivefour(list1):  
    i = 0  
    flag = list1[0]  
    count = 0  
    # 依次查找  
    while i < len(list1):  
        # 如果一样,则计数器加一,下标加一  
        if flag == list1[i]:  
            count += 1  
            if count >= 4:  
                return True  
            i += 1  
        # 如果不一样则计数器清0并下标加一  
        else:  
            flag = list1[i]  
            i += 1  
            count = 1  
    # 如果遍历整个列表之后仍然找不到则返回False  
    return False  
# 主函数  
temp = []  
print("Please input numbers to end with -1:")  
# 循环获取输出  
while True:  
    a = eval(input())  
    if a == -1:  
        break  
    temp.append(a)  
# 进行输出  
print(isconsecurivefour(temp))  

定义i为下标值,flag为当前查找值,count为计数值。通过while对列表进行循环,并判断当前值与当前查找值是否相等,如果相等则计数加一,并下标自增1。如果不相等则将计数置为1,重置当前查找值,并将下标值加一进行下一次搜索。如果查找过程中计数值某刻大于等于4,则返回True。否则当遍历完整个列表后仍然未找到连续出现4次的元素,则返回False。

主函数中通过依次获得列表的输入,并调用函数以输出结果。


(3)运行并测试


①测试存在连续4个相同值的列表:


2dd68aa8e55748b88870ac4be9bd1121.png

②测试不存在连续4个相同值的列表:


f4f00b50e47c4936947b461da27113a8.png


5. “几乎对称”列表


如果在一个非对称列表中,我们交换任意两个元素之后, 列表是对称的,则把这个列表称为“几乎对称”列表。例如,列表 lst=[1, 2, 1, 2] 是几乎对称的,因为交换 lst[2]和 lst[3]之后,得到对称的列表[1, 2, 2, 1]。编写函数 is_almost_symmetric(lst), 仅当列表 lst 是几乎对称列表时,返回 True。


(1)基本思路


首先判断是否为对称,如果直接为对称则直接返回False。如果不为对称则暴力穷举每一种可能的交换可能并判断是否为对称,如果可能则返回True,尝试了所有可能后如果仍然不可以则返回False。


(2)编程实现

# 定义判断是否是对称函数  
def is_symmetric(list1):  
    # 从两端开始进行查找  
    i = 0  
    j = len(list1)-1  
    while i < j:  
        if list1[i] == list1[j]:  
            i += 1  
            j -= 1  
        else:  
            return False  
    return True  
# 定义判断是否是几乎对称函数  
def is_almost_symmetric(list1):  
    # 穷举每一种可能  
    for i in range(0, len(list1)-1):  
        for j in range(0, len(list1)-1):  
            listTemp = list1+[]  
            temp = listTemp[i]  
            listTemp[i] = listTemp[j]  
            listTemp[j] = temp  
            # 进行判断如果对称则返回True  
            if is_symmetric(listTemp):  
                return True  
            # 不对称则进行下一次穷举判断  
    return False  
# 主函数  
temp = []  
print("Please input numbers to end with -1:")  
# 循环获取输出  
while True:  
    a = eval(input())  
    if a == -1:  
        break  
    temp.append(a)  
# 进行输出  
print((not is_symmetric(temp)) and is_almost_symmetric(temp))  

首先定义判断是否对称函数,从列表头和尾各设置一下标,依次判断下标对应值是否相等,如果相等则头下标加一尾下标减一进行下一次判断,直至头下标大于等于尾下标。否则返回False。

再定义判断是否几乎对称函数,通过暴力穷举穷举每一种可能的交换情况,如果在某次交换下满足列表变为对称,则返回True。遍历所有可能后仍然找不到可能的交换方式的返回False。

主函数中通过依次获得列表的输入,并调用函数以输出结果。


(3)运行并测试


①如果输入对称列表,则返回False:


114d00b0b05a4703b4e56c2e704b850b.png

②如果输入列表为几乎对称列表,则返回True:

73c4aa60f6e5450eb42a2e3efe24b86f.png

③如果输入列表既不对称也不几乎对称,则返回False:

caf247efa49a40d7ab3c295e10137159.png


6. 元组的理解


测试并回答以下问题:

(1)下面代码是否正确?解释原因。


t = (1, 2, 3)
t.append(4) 
t.remove(0) 
t[0] = 1


答:错误。因为元组不能被修改,故不能修改其中的元素值。

(2)下面代码是否正确?解释原因。


t1 = (1, 2, 3, 7, 9, 0, 5)
t2 = (1, 2, 5)
t1 = t2


答:正确。可以通过赋值运算符重新初始化元组。此时t1元组与t2元组都为(1,2,5)


(3)切片:测试下面代码,解释输出的结果。

t = (1, 2, 3, 7, 9, 0, 5)

①print(t[3])

输出:7

解释:切片下标为3(第4个)的元素,则输出元组中第四个元素的值。


②print(t[1: 3])

输出:(2, 3)

解释:切片下标从1到2的元素,则输出元组中第二、三个元素的值。


③print(t[-1:-3])

输出:()

解释:切片从倒数第1个到倒数第3个的元素,切片顺序反了,故输出空元组。


④print(t[-1:-3:-1])

输出:(5, 0)

解释:以步长-1切片从倒数第1个到倒数第2个的元素,故输出下标倒数第1个到倒数第2个组成的元组。


⑤print(t[-1: : -3])

输出:(5, 7, 1)

解释:以步长-3切片从倒数第1个到元组头的元素。故输出下标倒数第1个对应元素,下标倒数第1个下标减3对应元素和下标倒数第1个下标减6对应元素组成的元组。


⑥print(t[ : -1: 3])

输出:(1, 7)

解释:以步长3切片从第1个到最后1个前的元素。故输出下标0对应元素和下标0+3对应元素组成的元组。


⑦print(t[3 : -1: 3])

输出:(7,)

解释:以步长3切片从第4个到最后1个前的元素。故输出下标4对应元素组成的元组。


⑧print(t[3 : -1: -3])

输出:()

解释:以步长-3切片从第4个到最后1个前的元素。切片顺序反了,输出空元组。


实验心得


通过本次对列表和元组应用的学习,我学会了如何使用列表和元组完成对应的操作。列表和元组与C++中数组和vector容器类似,又不完全一样。Python中的元组提供了很丰富的切片方式,这是C++里所不具备的。本次实验中,我也学会了使用迭代器等对列表进行遍历等操作,熟悉了列表的相关函数,也夯实了Python的基本语法和编写函数的能力。这些都为我以后Python更深层次的学习打下了坚实基础。

本次实验中,也发现了比较值得注意的一点,列表不能使用“=”进行复制。通过“=”只能建立两个列表间的关联,修改一个,另外一个也会跟着修改,如果想要复制,可以利用切片或者合并操作完成复制。


相关文章
|
4天前
|
安全 数据处理 索引
深入探讨 Python 列表与元组:操作技巧、性能特性与适用场景
Python 列表和元组是两种强大且常用的数据结构,各自具有独特的特性和适用场景。通过对它们的深入理解和熟练应用,可以显著提高编程效率和代码质量。无论是在数据处理、函数参数传递还是多线程环境中,合理选择和使用列表与元组都能够使得代码更加简洁、高效和安全。
24 9
|
9天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
38 12
|
7天前
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
138 9
|
7天前
|
算法 安全 网络安全
基于 Python 的布隆过滤器算法在内网行为管理中的应用探究
在复杂多变的网络环境中,内网行为管理至关重要。本文介绍布隆过滤器(Bloom Filter),一种高效的空间节省型概率数据结构,用于判断元素是否存在于集合中。通过多个哈希函数映射到位数组,实现快速访问控制。Python代码示例展示了如何构建和使用布隆过滤器,有效提升企业内网安全性和资源管理效率。
37 9
|
1天前
|
人工智能 数据库连接 开发工具
[oeasy]python069_当前作用域都有些什么_列表dir_函数_builtins
本文介绍了Python中`dir()`函数的使用方法及其作用。`dir()`可以列出当前作用域内的所有变量和成员,类似于`locals()`,但`dir()`不仅限于本地变量,还能显示模块中的所有成员。通过`dir(__builtins__)`可以查看内建模块中的所有内建函数,如`print`、`ord`、`chr`等。此外,还回顾了`try-except-finally`结构在数据库连接中的应用,并解释了为何`print`函数可以直接使用而无需导入,因为它位于`__builtins__`模块中。最后,简要提及了删除`__builtins__.print`的方法及其影响。
13 0
|
9月前
|
索引 Python 存储
Python 04 之变量【列表,元组,集合,字典,字符串】
Python 04 之变量【列表,元组,集合,字典,字符串】
122 0
Python 04 之变量【列表,元组,集合,字典,字符串】
|
4月前
|
存储 安全 Serverless
Python学习四:流程控制语句(if-else、while、for),高级数据类型(字符串、列表、元组、字典)的操作
这篇文章主要介绍了Python中的流程控制语句(包括if-else、while、for循环)和高级数据类型(字符串、列表、元组、字典)的操作。
70 0
|
4月前
|
存储 JSON 数据处理
分析、总结Python使用列表、元组、字典的场景
分析、总结Python使用列表、元组、字典的场景
61 0
|
6月前
|
存储 索引 Python
Python学习笔记----列表、元组和字典的基础操作
这篇文章是一份Python学习笔记,涵盖了列表、元组和字典的基础操作,包括它们的创建、修改、删除、内置函数和方法等。
Python学习笔记----列表、元组和字典的基础操作
|
4月前
|
Python
Python操作:字符串--列表--元组--字典--运算符 (一)
Python操作:字符串--列表--元组--字典--运算符 (一)
31 0

热门文章

最新文章