☰
Python基础语法练习题(37-39)
2026/10/1 16:02:23 网站建设 项目流程

今天也来同步更新关于Python的几道练习题。

第三十七题,交换列表首尾元素:

#定义一个函数,该函数接受一个列表newList作为参数。函数的功能是交换列表的第一个元素和最后一个元素,并返回交换后的列表。 #定义函数 def swap_first_last(newList): """ 交换列表的第一个元素和最后一个元素 :param newList: 列表 :return: 交换后的列表 """ newList[0], newList[-1] = newList[-1], newList[0] return newList #交换列表元素 Li1 = [1,2,3] Li2 = ['a','b','c','d','e'] #调用函数 print(swap_first_last(Li1)) print(swap_first_last(Li2))

这个代码块的思维如下:

交换列表的首尾元素
题目要求:把列表的第一个元素和最后一个元素换个位置,中间的不动。比如 1、2、3 变成 3、2、1;a、b、c、d、e 变成 e、b、c、d、a。
核心思路:两个位置直接对调,不用第三个"杯子"
很多人会想"得先找个地方把第一个数存起来,不然一覆盖就丢了"。其实 Python 支持在同一行同时给两个位置赋值:先把右边两个值一起记住,再分别塞回左边。就像两只手在空中同时交换东西,落地时已经互换了归属,不需要第三只手。
取最后一项用的是负数下标,-1 就代表最后一个元素,比先算长度再减一省事得多。
举个例子
函数拿到 1、2、3,看一眼首项是 1、末项是 3,对调后就地变成 3、2、1,再返回打印。a 到 e 那组同理。
一个细节
这个函数改的是传进去的列表本身,不是副本。调用完 Li1、Li2 就已经变了。对本题没影响,但要记住:就地修改之后原始数据就没了,想保留得先复制一份。另外空列表去取首项会报错,最好先判断一下;只有一个元素时是自己跟自己换,结果不变也不报错。
小结
精髓是"同时赋值一行对调":不用临时变量,也不用关心列表长度。当然也能用中间变量三步走,或弹出再插入,结果都对,只是更啰嗦。最后提醒:若题目改成"整个列表倒过来",就得用反转或切片,交换首尾解决不了。

第三十八题,交换列表指定位置元素:

# 定义一个函数,该函数用于将指定列表中指定索引位置的元素互换 # 定义函数 def swap_positions(newList, pos1, pos2): """ 交换列表中指定索引位置的两个元素 :param newList: 列表 :param pos1: 第一个元素的索引位置 :param pos2: 第二个元素的索引位置 :return: 交换后的列表 """ newList[pos1], newList[pos2] = newList[pos2], newList[pos1] return newList # 交换列表元素 Li1 = [23, 65, 19, 90] # 用户输入指定要交换的两个索引位置 pos1 = int(input("请输入第一个索引位置(选择数字0-3):")) pos2 = int(input("请输入第二个索引位置(选择数字0-3):")) # 调用函数 print(swap_positions(Li1, pos1, pos2))

这个代码块的思维如下:

交换列表指定位置的元素
题目要求:给一个列表和两个位置编号,把这两个位置上的元素互换,其他元素不动。比如 23、65、19、90,指定位置 0 和 2,换完就是 19、65、23、90。
核心思路:把"位置"也变成参数,交换动作完全一样
上一题是固定的首尾,这一题的难点其实不在交换,而在"位置由外面传进来"。函数多收了两个参数 pos1、pos2,交换那一行只是把写死的 0 和 -1 换成了这两个变量。同时赋值的道理没变:先把右边两个值一起记住,再分别塞回左边,两只手在空中同时交换,不需要第三个"杯子"。
这里还多做了一步——用 input 让用户自己输入位置,并且用 int 把输入的字符串转成数字。这个转换不能省,因为 input 拿到的永远是文字,"0" 和 "2" 不转成数字就没法当下标用。
举个例子
列表是 23、65、19、90,用户输入 0 和 2。函数取出位置 0 的 23 和位置 2 的 19,对调后列表就地变成 19、65、23、90,再返回打印。
几个细节
第一,下标从 0 开始数,所以四个元素的位置是 0、1、2、3,这也是提示语写"0-3"的原因,初学者很容易按 1 开始数而错位。第二,函数改的还是传进去的列表本身,不是副本,调用完 Li1 就变了。第三,边界情况:输入的编号超出范围(比如 5 或 -6)会直接报错;输入的不是数字也会报错;两个位置输成一样的,则是自己跟自己换,结果不变但不会出错。想更稳的话,可以在调用函数前先判断一下编号是否合法,不合法就提示重输。
小结
精髓是"把位置参数化":交换逻辑和上一题一模一样,只是把固定下标换成变量,再配上输入与类型转换,就成了一道通用题。也可以写成用中间变量三步走,结果相同只是更啰嗦。往后如果遇到"按位置批量调整顺序"的需求,思路仍然是这套——先确定位置,再对调。

第三十九题,统计列表中元素出现的次数:

#定义一个函数,该函数用于统计列表中元素出现次数 # 方法一:统计列表中指定元素出现的次数 #定义函数 def count_occurrences(lst, element): """ 统计列表中元素出现次数 :param lst: 列表 :param element: 元素 :return: 元素在列表中出现的次数 """ count = 0 for i in lst: if i == element: count += 1 return count #给定列表 Li = [1,4,3,3,2,2,3,5,3,1] print(count_occurrences(Li, 3)) # 方法二:统计列表中所有元素出现的次数 # 定义函数 def count_all_occurrences(lst): """ 统计列表中所有元素出现的次数 :param lst: 列表 :return: 字典,键为元素,值为该元素出现的次数 """ result = {} for i in lst: # 元素第一次出现时 get 返回默认值 0,再 +1 累计 result[i] = result.get(i, 0) + 1 return result # 给定列表 Li = [1, 4, 3, 3, 2, 2, 3, 5, 3, 1] # 统计并展示所有元素出现的次数 counts = count_all_occurrences(Li) for element, count in counts.items(): print(f"元素 {element} 出现了 {count} 次") # 方法三:统计列表中所有元素出现的次数(复用方法一) def count_all_occurrences(lst): """ 统计列表中所有元素出现的次数 :param lst: 列表 :return: 字典,键为元素,值为该元素出现的次数 """ result = {} for element in set(lst): # set 去重,遍历每个不同元素 result[element] = count_occurrences(lst, element) # 复用原函数 return result # 方法四:使用 collections.Counter 统计列表中所有元素出现的次数 # from collections import Counter # def count_all_occurrences(lst): # return dict(Counter(lst)) # Li = [1, 4, 3, 3, 2, 2, 3, 5, 3, 1] # print(count_all_occurrences(Li)) # {1: 2, 4: 1, 3: 4, 2: 2, 5: 1}

这个代码块的思维如下:

统计列表中元素出现次数
题目要求:给一个列表,统计某个元素在里面出现了几次;再进一步,把列表里每个元素各出现多少次都算出来。比如列表 1、4、3、3、2、2、3、5、3、1,问 3 出现几次,答案是 4 次;问全部,就是 1 出现 2 次、4 出现 1 次、3 出现 4 次、2 出现 2 次、5 出现 1 次。
核心思路:从"数一个"到"数全部",四种写法层层递进 这道题代码里给了四种方法,其实是同一个问题的四种解法。方法一最朴素:定义 count_occurrences,接收列表和一个目标元素,用一个计数器 count 从 0 开始,遍历列表每遇到一个相等的就加 1,最后返回。方法二要数全部元素,关键在那一行 result[i] = result.get(i, 0) + 1——用字典存结果,get 的妙处是"元素第一次出现时返回默认值 0",避免直接写 result[i] 因为键不存在而报错。方法三换了个角度:先用 set 去重得到所有不同元素,再对每个元素调用方法一的函数,属于"复用旧代码"。方法四则直接搬出标准库 collections.Counter,一行搞定,是最省事的生产写法。
举个例子 列表是 1、4、3、3、2、2、3、5、3、1。方法一数 3,遍历一遍遇到 4 个 3,返回 4。方法二从头扫,字典随着遍历慢慢填充成 {1:2, 4:1, 3:4, 2:2, 5:1},再用 for 循环配 items() 一条条打印成"元素 X 出现了 Y 次"。
几个细节 第一,方法二里的 get(i, 0) 不能省成 result[i],否则第一次遇到新元素会直接报 KeyError。第二,方法三和方法二函数同名 count_all_occurrences,后定义的会覆盖前面的,这在同一个文件里要注意,实际只会保留最后一个生效。第三,方法三用 set 去重后遍历次数更少,但每次数一个元素都要把整个列表再扫一遍,数据量大时反而更慢;方法二只扫一遍,效率更高。第四,方法四被整段注释掉了,Counter 返回的是特殊对象,代码里用 dict() 把它转成普通字典,结果和方法二完全一样。第五,== 比较的是值,所以数字、字符串都能正确统计。
小结 精髓是"计数器思想 + 字典存结果":先学会数一个元素,再用字典的 get 技巧把结果收集起来数全部,最后知道有 Counter 这种现成轮子。四种方法从手写到底层库,正好体现了 Python 解决问题由繁到简的过程。往后遇到"分组统计""词频统计"这类需求,思路都是这套——遍历一次,边看边记,用字典把每个键对应的次数累加起来。

上面就是关于37-39这三题的一些内容记录。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询