Python每日一题 2025.3.24
一、题目
编写程序用户输入一个列表和2个整数作为下标,然后输出列表中介于2个下标闭区间之间的元素组成的子列表。列入用户输入[1,2,3,4,5,6]和2 、5,程序输出[3,4,5,6].
二、分析
这个题其实就是想练习切片的使用方式。如果一上来读题觉得异常简单,那其实就踩进陷阱里了。注意看,题目说的是两个整数作为下标,代表下标也可以是负的,这样对于问题的解决就相对麻烦一些了。当然,我肯定看不出来的,做完之后又看了ai给的结果,才明白的。。。
如果从正负角度来划分的话,会存在正正、负负、正负、负正这四种情况,那么有没有更好的解决方式呢?其实从切片角度来讲,就不用分这么多在情况了,直接用作下标就好了。可是题目中说"作为下标",那么输入的下标是否合法呢?我们就按照最坏的情况,输入存在不合法的情况,并且不是顺序输入的。
三、自己源代码
import pdb
def get_legal(num,len):
if num>=-len and num<len and num>=0:
return num
elif num>=-len and num <len and num<0:
return num+len
elif num<-len:
return -len
elif num>=len:
return len
l=list(map(int,input().split()))
start=int(input())
end=int(input())
start=get_legal(start,len(l))#让输入范围变得合法,且负数变为正数
end=get_legal(end,len(l))
#下面是防止输入顺序不合法,比如start=4,end=1
a=start
start=min(start,end)
end=max(a,end)
# pdb.set_trace()
print(l[start:end+1])
输出有多种情况,就不展示了。做的时候发现切片其实非常灵活,即使输入超出范围,也会截取存在的那一段,所以根本不用考虑越界情况。另外我也看了,即使输入顺序不合法,也不会报错,而是会返回一个空列表。
四、deepseek答案
# 用户输入列表
lst = eval(input("请输入列表:"))
# 用户输入两个下标
i, j = map(int, input("请输入两个下标,用空格分隔:").split())
length = len(lst)
# 处理负数下标
i_normalized = i if i >= 0 else i + length
j_normalized = j if j >= 0 else j + length
# 确定起始和结束下标
start = min(i_normalized, j_normalized)
end = max(i_normalized, j_normalized)
# 提取子列表并输出
sub_list = lst[start:end+1]
print(sub_list)
输入/输出
我一开始输入1 2 3 直接报错,后来查了查eval,eval() 会将传入的字符串作为 Python 代码执行,并返回执行结果。它通常用于执行简单的数学表达式或从字符串中动态计算表达式。这里先不细究eval,我们来分析一下代码逻辑。先看下标输入,用空格分开,我使用两个input()分开的,存在的问题就是输入时必须用回车换行,用空格的话直接报错。它这里没有考虑越界情况,只是正负转换,默认输入不越界。后面也注意到了输入顺序问题,重新规划下标。
五、源代码与ai分析
首先还是输入上面,ai给的输入更加灵活,而不是一直重复使用input()。另外,处理负下标的时候,风格也更pythonic,而我自己写的,给人一种守旧的感觉。