使用for循环迭代时出现TypeError / IndexError

时间:2018-10-19 10:44:33

标签: python loops for-loop typeerror index-error

我正在使用for循环遍历这样的列表:

lst = ['a', 'b', 'c']
for i in lst:
    print(lst[i])

但是这一定有问题,因为它引发以下异常:

Traceback (most recent call last):
  File "untitled.py", line 3, in <module>
    print(lst[i])
TypeError: list indices must be integers or slices, not str

如果我使用整数列表尝试相同的操作,则会抛出IndexError

lst = [5, 6, 7]
for i in lst:
    print(lst[i])
Traceback (most recent call last):
  File "untitled.py", line 4, in <module>
    print(lst[i])
IndexError: list index out of range

我的for循环出了什么问题?

2 个答案:

答案 0 :(得分:2)

Python的for循环遍历列表的,而不是 indices

lst = ['a', 'b', 'c']
for i in lst:
    print(i)

# output:
# a
# b
# c

这就是为什么如果尝试使用lsti编制索引的原因,就会出现错误:

>>> lst['a']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not str
>>> lst[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

许多人使用索引来摆脱习惯,因为他们习惯于从其他编程语言中那样进行索引。但是在python中,您很少需要索引。遍历值更加方便:

lst = ['a', 'b', 'c']
for val in lst:
    print(val)

# output:
# a
# b
# c

如果确实需要循环中的索引,则可以使用enumerate函数:

lst = ['a', 'b', 'c']
for i, val in enumerate(lst):
    print('element {} = {}'.format(i, val))

# output:
# element 0 = a
# element 1 = b
# element 2 = c

答案 1 :(得分:0)

推论:命名您的循环变量,以避免混淆和错误的代码

  • for i in lst是一个可怕的名字
    • 建议这是一个索引,我们可以并且应该做lst[i],这是胡说八道,并且会引发错误
    • i,j,n之类的名称通常仅用于索引
  • 良好:for x in lstfor el in lstfor lx in lst
    • 没有人会尝试写lst[el];名称的选择非常明显,它没有索引,并且可以防止您胡说八道。

摘要:

  • Python for循环变量采用列表中的值,而不是其索引
  • 通常不需要索引,但是如果需要,请使用enumerate()for i, x in enumerate(list): ...
  • 通常更好的习惯用法是直接遍历列表(而不是索引,然后查找每个条目)