我是python的新手。我在python中学习for循环的语法:
for var in list_name:
# do something
我拿了一个清单:
list = [1,2,3,4,5,6,7,8,9]
我想将其每个元素加倍,所以我运行一个循环:
for i in list :
index = list.index(i)
list[index] = 2*i
print(list)
然后打印:
[16,2,12,4,10,6,14,8,18]
我不明白为什么这样打印?
答案 0 :(得分:6)
让我们完成循环的前几次迭代。
迭代1:i
为1。
index = list.index(i)
list[index] = 2*i
index
为0,list[0]
设置为2*i
。该列表现在看起来像[2, 2, 3, 4, 5, 6, 7, 8, 9]
。
迭代2:i
为2。
index = list.index(i)
list.index(2)
在列表中找到2
的第一个匹配项,其索引为 0 !有多个2
,而您没有选择正确的。{/ p>
list[index] = 2*i
你加倍错误的元素!
这在迭代4,6和8上再次发生。
如果要将列表元素加倍,最简单的方法是创建一个包含列表解析的新列表:
l = [2*i for i in l]
如果您需要for
循环中元素的索引,最好的方法通常是enumerate
列表:
for i, item in enumerate(l):
whatever()
另外,不要调用列表list
,或者当您尝试调用list
函数时,您会得到一个奇怪的TypeError。
答案 1 :(得分:3)
您的代码无法按预期工作,因为list.index
将返回列表中元素的第一个索引。因此,如果同一元素出现不止一次,它将无法按预期工作。
双元素的最佳方法是使用列表推导,就像这样
my_list = [item * 2 for item in my_list]
如果您想使用for循环,可以使用enumerate
,就像这样
for index, current_num in enumerate(my_list):
my_list[index] = current_num * 2
这很难看,因为我们在迭代时修改列表。所以,不要这样做。相反,你可以这样做
for index in xrange(len(my_list)):
my_list[index] *= 2
答案 2 :(得分:2)
list.index(i)
返回列表中找到i
的第一个索引。
thelist = [1,2,3,4,5,6,7,8,9]
> index = thelist.index(1)
> index = 0
> thelist[0] = 2
> index = thelist.index(2)
> index = 0
> thelist[0] = 2*2 = 4
> index = thelist.index(3)
> index = 2
> thelist[2] = 2*3 = 6
> index = thelist.index(4)
> index = 0
> thelist[0] = 2*4 = 8
> index = thelist.index(5)
> index = 4
> thelist[4] = 2*5 = 10
> index = thelist.index(6)
> index = 2
> thelist[2] = 2*6 = 12
> index = thelist.index(7)
> index = 6
> thelist[6] = 2*7 = 14
> index = thelist.index(8)
> index = 0
> thelist[0] = 2*8 = 16
> index = thelist.index(9)
> index = 8
> thelist[8] = 2*9 = 18
其余元素将保持不变。
此外,使用关键字作为变量名称是不正确的。您不应该使用list
作为变量名。
答案 3 :(得分:0)
因为您每次都在改变列表中的错误元素。语法for i in list
设置列表中一个元素的值,而不是索引。
实际上,您不应该更改您正在处理的列表,而是创建新列表。一个正确的方法是:
new_list = []
for i in list:
new_list.append(2*i)
# Or even, with a list comprehension
new_list = [i*2 for i in list]
print(new_list)
答案 4 :(得分:0)
print map(lambda x: x*2, my_list)