Python每日一题(4)

一、题目

  编写程序用户输入一个列表和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,而我自己写的,给人一种守旧的感觉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值