使用for循环遍历python中的列表

Posted

技术标签:

【中文标题】使用for循环遍历python中的列表【英文标题】:Iterating over a list in python using for-loop 【发布时间】:2019-01-15 20:13:36 【问题描述】:

我有一个关于在 python 中迭代列表的问题。 假设我有一个列表:row = ['1', '2', '3'],并且想要将其元素转换为整数,这样:row = [1, 2, 3]

我知道我可以通过列表理解来做到这一点:

row = [int(i) for i in row]

或for循环:

for i in range(len(row)):
    row[i] = int(row[i])

我的问题涉及range(len(row)) 部分。有人可以用外行友好的方式回答吗,为什么我可以这样做:

for i in row:
    print(i)

但我不能这样做:

for i in row:
    row[i] = int(row[i])

【问题讨论】:

尝试在解释器中运行['1', '2']['1']。你可以使用字符串作为列表的索引吗? 这将有助于anandology.com/python-practice-book/iterators.html 谢谢,现在我明白了。我认为 for i 适用于索引,所以它从第一个元素到最后一个元素,没有得到它的值,就像在列表理解中一样。 i 只是一个任意变量名,它不会影响正在发生的事情。你可以叫它banana,它的工作原理都是一样的。 @juanpa.arrivillaga 我的意思是在for循环中,变量ibanana取列表元素的值,所以如果列表是['3',1'','2'],首先i会具有3 的值,但在列表理解中使用相同的for i in 第一个i0 【参考方案1】:

当您执行for i in row 时,i 会获取row 中的值,即'1',然后是'2',然后是'3'

这些是字符串,不能作为列表索引。列表索引应该是整数。在执行range(len(row)) 时,您循环的整数最大为列表的大小。

顺便说一句,更好的方法是:

for elt_id, elt in enumerate(list):
    # do stuff

【讨论】:

另外,即使转换,由于第一个val不为0,也会抛出索引超出范围错误。 @dfundako 是的,转换不是一个好主意,特别是因为它可以工作,因为它的示例具有可能是索引的值,但它也可能是其他东西...... 你能解释一下for elt_id, elt in enumerate(list):吗? elt_id, elt 是什么? @Gigaflop 做for i in range(len(list)): 是不好的做法。更好的方法是使用enumerate(),它将返回一个元组(id, elt)。因此,使用 enumerate,您可以在每次迭代中同时获得 id 和元素。相当于:for id in range(len(list)): elt = list[id] @mykoza 最好使用range(len(list)),但它也使用for循环。它可以合并到列表理解中。您有 3 个场景:1 您需要迭代列表中的元素,然后只需使用 for elt in list:,2 您只需要索引,3 您将需要索引和元素。对于最后这两个,最好使用enumerate 而不是range(len(list))【参考方案2】:

当你这样做时

for i in row:
    row[i] = int(row[int(i)]) 

i 是数组row 中的元素。因此,i 将是“1”然后是“2”然后是“3”。

但索引必须是整数,而 i 是字符串,所以会有错误。


如果你这样做:

for i in row:
    row[int(i)] = int(row[i]) 

仍然会出错,因为 i 是数组row 中元素的整数。因此,我将是 1,然后是 2,然后是 3。

但是row[3]会导致IndexError,因为列表中只有3个元素并且编号从0开始。


而在另一种情况下(第一种情况),i 变为 0 然后 1 然后 2 这不会导致错误,因为 row[2] 是有效的。


原因是:

range() 是基于 0 索引的,这意味着列表索引从 0 开始,而不是 1。例如。 访问列表第一个元素的语法是 mylist[0] 。 因此 range() 生成的最后一个整数最多,但不是 包括,停止。

【讨论】:

感谢您的回答!你能告诉我为什么在看似相同的构造中:for i in row,有两种不同的方式来处理i?我的意思是,在循环中,i 从列表中获取值,但在列表理解中它从 0 开始? 感谢您的详细说明,但我不是指range() 函数。我的意思是在列表理解中[sth for i in list]i 从0 开始,但在循环中for i in list: sthi 采用list 元素的值 @mykoza row = [int(i) for i in row] 也开始 i 从 1 到 3(这是列表的元素),但它创建了一个名为 row 的新列表,其中包含 int(i) 其中 i 是列表中的每个元素排。所以新列表变为row = [int("1"), int("2"), int("3")]【参考方案3】:

下面是 IDLE 的一个例子:

>>> row = ['1', '2', '3']
>>> for i in row:
    row[i] = int(row[i])

Traceback (most recent call last):
  File "<pyshell#3>", line 2, in <module>
    row[i] = int(row[i])
TypeError: list indices must be integers or slices, not str

被迭代的项目不是整数,不能用作列表的索引。

以下内容在某些时候会起作用,但最后会抛出IndexError

for i in row:
    i2 = int(i)
    row[i2] = i2

【讨论】:

【参考方案4】:

给定row = ['1', '2', '3'],行内的每个项目都是一个字符串,因此可以轻松打印:

for i in row:
    print(i)

但是,在您的第二个示例中,您尝试使用字符串访问行。您需要一个整数来访问列表中的值,而行是一个列表! (字符串,但仍然是一个列表)。

for i in row:
    # row[i] = int(row[i])  -> this will throw an error
    row[int(i)] = int(row[int(i)]) # this will throw an error

【讨论】:

以上是关于使用for循环遍历python中的列表的主要内容,如果未能解决你的问题,请参考以下文章

Python:使用 while 或 for 循环遍历列表

为啥for循环遍历python中的1个项目? [关闭]

Python中的迭代遍历 for in

Python入门教程第34篇 列表遍历

JS中的forEach,for in,for of和for的遍历优缺点及区别

为啥 for 循环不遍历列表中的每个项目?