V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
KnightNic
V2EX  ›  Python

求教 Python enumerate 问题

  •  
  •   KnightNic · 2021-01-14 13:52:25 +08:00 · 1723 次点击
    这是一个创建于 1411 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下: 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 语言还残存一丢丢记忆。。。

    9 条回复    2021-01-14 16:41:37 +08:00
    rocksolid
        1
    rocksolid  
       2021-01-14 14:13:37 +08:00   ❤️ 2
    字符串 str 、列表 list 、元组 tuple 进行按索引取值的时候,默认范围为 0 ~ len(有序序列)-1,计数从 0 开始,而不是从 1 开始,最后一位索引则为总长度减去 1 。
    如果输入的取值结果不在这个范围内,则报这个错。
    Latin
        2
    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
        3
    KnightNic  
    OP
       2021-01-14 14:38:17 +08:00
    @Latin @rocksolid 感谢二位,其实我之前调试的时候,尝试在修改 df = pd.read_csv(files[int(file)-1]),确实能够接受用户 1 和 2 的输入选择,可是当我输入 0 的时候,貌似默认返回了序号 2 对应的文件。
    另外想请教下如果我想在 input 之后加一个判断,比如输入的数字在索引到的文件序号之内,则进入后续代码,否则就返回一段文字,比如“输入错误”之类的。

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

    enumerate 还能设索引起始值,,以前没注意过,,学到一手
    Latin
        5
    Latin  
       2021-01-14 15:28:45 +08:00
    @KnightNic 0-1 是-1 而-1 是列表最后一位
    maocat
        6
    maocat  
       2021-01-14 15:32:37 +08:00
    enumerate 点开看源码你就会发现第二个可变参数名字叫 start
    KnightNic
        7
    KnightNic  
    OP
       2021-01-14 15:35:15 +08:00
    @Latin 感谢,目前已经大致解决了,也实现了一些 input 时的判断,不过想请教一下怎么去修改列表的索引起始值,从 1 开始,使只跟 enumerate ( files, 1 )一致呢?
    我目前是用了一个 if 语句,强制剔除了 input 为 0 的情况
    no1xsyzy
        8
    no1xsyzy  
       2021-01-14 15:45:27 +08:00
    @KnightNic 不能改起始值
    但,如果你不介意的话,有 dict[int, Any] 和 list[None, Any] 两种做法
    Latin
        9
    Latin  
       2021-01-14 16:41:37 +08:00
    @KnightNic case 条件 1<input<len(files) 再处理 files 为空的情况不就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3367 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:07 · PVG 20:07 · LAX 04:07 · JFK 07:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.