使用for循环在python中迭代列表

使用for循环在python中迭代列表,python,list,for-loop,iteration,Python,List,For Loop,Iteration,我有一个关于在python中迭代列表的问题。 假设我有一个列表:row=['1','2','3'],并希望将其元素转换为整数,这样:row=[1,2,3] 我知道我可以通过列表理解做到: row = [int(i) for i in row] 或用于循环: for i in range(len(row)): row[i] = int(row[i]) 我的问题是关于兰格兰罗的部分。有没有人能用外行友好的方式回答我,为什么我可以这样做: for i in row: print(i

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

我知道我可以通过列表理解做到:

row = [int(i) for i in row]
或用于循环:

for i in range(len(row)):
    row[i] = int(row[i])
我的问题是关于兰格兰罗的部分。有没有人能用外行友好的方式回答我,为什么我可以这样做:

for i in row:
    print(i)
但我不能这么做:

for i in row:
    row[i] = int(row[i])
当您对行中的i执行此操作时,我将获取行中的值,即“1”,然后是“2”,然后是“3”

这些是字符串,作为列表索引无效。列表索引应为整数。在执行rangelenrow时,循环整数直到列表的大小

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

for elt_id, elt in enumerate(list):
    # do stuff
当您对行中的i执行此操作时,我将获取行中的值,即“1”,然后是“2”,然后是“3”

这些是字符串,作为列表索引无效。列表索引应为整数。在执行rangelenrow时,循环整数直到列表的大小

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

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

下面是来自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

下面是来自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
给定行=['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
给定行=['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 i in row:
    row[i] = int(row[int(i)]) 
i是数组行中的元素。因此,我将是“1”然后是“2”然后是“3”

但是索引必须是整数,i是字符串,所以会出现错误

如果您这样做:

for i in row:
    row[int(i)] = int(row[i]) 
这仍然是一个错误,因为i是数组行中元素的整数。因此,我将是1,然后是2,然后是3

但行[3]将导致索引器错误,因为列表中只有3个元素,编号从0开始

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

原因是:

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

当你这样做的时候

for i in row:
    row[i] = int(row[int(i)]) 
i是数组行中的元素。因此,我将是“1”然后是“2”然后是“3”

但是索引必须是整数,i是字符串,所以会出现错误

如果您这样做:

for i in row:
    row[int(i)] = int(row[i]) 
这仍然是一个错误,因为i是数组行中元素的整数。因此,我将是1,然后是2,然后是3

但行[3]将导致索引器错误,因为列表中只有3个元素,编号从0开始

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

原因是:

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


尝试在解释器中运行['1','2']['1']。你能用字符串作为列表的索引吗?这会有帮助的,谢谢,现在我明白了。我认为我处理索引,所以它从第一个元素到最后一个元素,没有得到它的值,就像在列表理解中一样。我只是一个任意的变量名,它不会影响正在发生的事情。你可以称它为香蕉,它的工作原理是一样的。@juanpa.arrivillaga我的意思是,在for循环中,变量I或香蕉取列表元素的值,所以如果list是['3',1','2',],首先我的值是3,但在列表理解中,使用相同的值,首先我在解释器中运行['1',2']['1']。你能用字符串作为列表的索引吗?这会有帮助的,谢谢,现在我明白了。我认为我处理索引,所以它从第一个元素到最后一个元素,没有得到它的值,就像在列表理解中一样。我只是一个任意的变量名,它不会影响正在发生的事情。你可以称它为香蕉,它的工作原理是一样的。@juanpa.arrivillaga我的意思是,在for循环中,变量I或香蕉取列表元素的值,所以如果list是['3',1,'2',],首先我的值是3,但在列表理解中,使用相同的值,第一个I是0,另外,即使转换了,由于第一个值不是0,将抛出索引超出范围错误。@dfundako是的,转换不是一个好主意,特别是因为它可以工作,因为它的示例中的值可能是索引,但也可能是其他内容……您能解释enumeratelist中的elt_id,elt吗?什么是elt_id,elt?@Gigaflop在rangelenlist中为我做的事:是不好的练习。
更好的方法是使用enumerate,它将返回元组id elt。因此,使用enumerate,可以在每次迭代中同时获得id和元素。它相当于:for rangelenlist中的id:elt=list[id]@mykoza,使用rangelenlist更好,但它也使用for循环。它可以被合并到一个列表中。您有3种场景:1您需要迭代列表中的元素,然后在列表中简单地用于elt:,2您只需要索引,3您将需要索引和元素。对于最后这两个值,最好使用枚举而不是RangeLenList。此外,即使转换,由于第一个值不是0,索引超出范围错误也会抛出。@dfundako是的,转换不是一个好主意,特别是因为它可以工作,因为它的示例中的值可能是索引,但也可能是其他原因……你能解释一下清单中的英语教学id吗?什么是elt_id,elt?@Gigaflop在rangelenlist中为我做的事:是不好的练习。更好的方法是使用enumerate,它将返回元组id elt。因此,使用enumerate,可以在每次迭代中同时获得id和元素。它相当于:for rangelenlist中的id:elt=list[id]@mykoza,使用rangelenlist更好,但它也使用for循环。它可以被合并到一个列表中。您有3种场景:1您需要迭代列表中的元素,然后在列表中简单地用于elt:,2您只需要索引,3您将需要索引和元素。对于最后两个,最好使用枚举而不是RangeLenListThank,谢谢你的回答!你能告诉我为什么在看起来相同的构造中:对于行中的i,有两种不同的方法来处理i吗?我的意思是,在循环中,我从列表中获取值,但在列表理解中,它从0开始?感谢您的详细说明,但我不是指范围函数。我想说的是,在列表理解[列表中的I的sth]中,我从0开始,但在列表中的I的循环中:sth,我取列表的值element@mykozarow=[inti for i in row]也从1到3开始i,这是列表中的元素,但它创建了一个名为row的新列表,该列表具有inti,其中i是列表行中的每个元素。所以新的列表变成了row=[int1,int2,int3]谢谢你的回答!你能告诉我为什么在看起来相同的构造中:对于行中的i,有两种不同的方法来处理i吗?我的意思是,在循环中,我从列表中获取值,但在列表理解中,它从0开始?感谢您的详细说明,但我不是指范围函数。我想说的是,在列表理解[列表中的I的sth]中,我从0开始,但在列表中的I的循环中:sth,我取列表的值element@mykozarow=[inti for i in row]也从1到3开始i,这是列表中的元素,但它创建了一个名为row的新列表,该列表具有inti,其中i是列表行中的每个元素。因此,新列表变为row=[int1,int2,int3]