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个相同值的列表:
②测试不存在连续4个相同值的列表:
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:
②如果输入列表为几乎对称列表,则返回True:
③如果输入列表既不对称也不几乎对称,则返回False:
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更深层次的学习打下了坚实基础。
本次实验中,也发现了比较值得注意的一点,列表不能使用“=”进行复制。通过“=”只能建立两个列表间的关联,修改一个,另外一个也会跟着修改,如果想要复制,可以利用切片或者合并操作完成复制。