使用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循环中,变量i
或banana
取列表元素的值,所以如果列表是['3',1'','2']
,首先i
会具有3
的值,但在列表理解中使用相同的for i in
第一个i
是0
【参考方案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: sth
、i
采用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中的列表的主要内容,如果未能解决你的问题,请参考以下文章