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更深层次的学习打下了坚实基础。

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


相关文章
|
2天前
|
Python
【Python操作基础】——元组
【Python操作基础】——元组
|
2天前
|
Python
【Python操作基础】——列表操作
【Python操作基础】——列表操作
|
2天前
|
分布式计算 调度 异构计算
Python 数学应用(四)(4)
Python 数学应用(四)
10 4
|
2天前
|
消息中间件 Kafka Python
Python 数学应用(四)(3)
Python 数学应用(四)
20 5
|
2天前
|
存储 传感器 数据可视化
Python 数学应用(四)(2)
Python 数学应用(四)
5 0
Python 数学应用(四)(2)
|
2天前
|
存储 消息中间件 Kafka
Python 数学应用(四)(1)
Python 数学应用(四)
10 2
|
2天前
|
机器学习/深度学习 存储 算法
Python 数学应用(三)(4)
Python 数学应用(三)
9 2
|
2天前
|
存储 算法 决策智能
Python 数学应用(三)(3)
Python 数学应用(三)
9 2
Python 数学应用(三)(3)
|
2天前
|
存储 资源调度 算法
Python 数学应用(三)(2)
Python 数学应用(三)
9 1
|
2天前
|
存储 机器学习/深度学习 前端开发
Python 数学应用(三)(1)
Python 数学应用(三)
11 2