求教 Python enumerate 问题

2021-01-14 13:52:25 +08:00
 KnightNic

代码如下: https://gist.github.com/KnightNic/e9d2ce3321ab78b0824ebc4316cd7102

可以正常打印,比如只有两个文件时,会以 0: a.csv, 1: b.csv 显示,终端选择 0 或 1 可以正常执行后续代码。

可是想请教一下为什么指定 enumerate(files, 1)之后,当终端输入选择 2 的时候就报错呢? index list out of range,Google 了很多,可是没研究出来

不是程序员工程师,只是为了避免员工手动处理一些需要定期处理的大表格,减少工作量~所以自己研究了下 python 和 pandas

大学时的 C 语言还残存一丢丢记忆。。。

1750 次点击
所在节点    Python
9 条回复
rocksolid
2021-01-14 14:13:37 +08:00
字符串 str 、列表 list 、元组 tuple 进行按索引取值的时候,默认范围为 0 ~ len(有序序列)-1,计数从 0 开始,而不是从 1 开始,最后一位索引则为总长度减去 1 。
如果输入的取值结果不在这个范围内,则报这个错。
Latin
2021-01-14 14:18:32 +08:00
l = [1,2]
for n,i in enumerate(l,1):
print(n,i)
# 1 1
# 2 2
l[2] # 此时 index list out of range
因为你设置了起始值为 1 而列表的索引没有改下标
KnightNic
2021-01-14 14:38:17 +08:00
@Latin @rocksolid 感谢二位,其实我之前调试的时候,尝试在修改 df = pd.read_csv(files[int(file)-1]),确实能够接受用户 1 和 2 的输入选择,可是当我输入 0 的时候,貌似默认返回了序号 2 对应的文件。
另外想请教下如果我想在 input 之后加一个判断,比如输入的数字在索引到的文件序号之内,则进入后续代码,否则就返回一段文字,比如“输入错误”之类的。

现在想想程序员、工程师确实不简单~早知道大学也深入学一个编程语言了
XIVN1987
2021-01-14 14:49:31 +08:00
@Latin

enumerate 还能设索引起始值,,以前没注意过,,学到一手
Latin
2021-01-14 15:28:45 +08:00
@KnightNic 0-1 是-1 而-1 是列表最后一位
maocat
2021-01-14 15:32:37 +08:00
enumerate 点开看源码你就会发现第二个可变参数名字叫 start
KnightNic
2021-01-14 15:35:15 +08:00
@Latin 感谢,目前已经大致解决了,也实现了一些 input 时的判断,不过想请教一下怎么去修改列表的索引起始值,从 1 开始,使只跟 enumerate ( files, 1 )一致呢?
我目前是用了一个 if 语句,强制剔除了 input 为 0 的情况
no1xsyzy
2021-01-14 15:45:27 +08:00
@KnightNic 不能改起始值
但,如果你不介意的话,有 dict[int, Any] 和 list[None, Any] 两种做法
Latin
2021-01-14 16:41:37 +08:00
@KnightNic case 条件 1<input<len(files) 再处理 files 为空的情况不就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/744885

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX