为什么循环不能像Python中预期的那样打印?

时间:2014-02-09 10:10:48

标签: python list

我是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] 

我不明白为什么这样打印?

5 个答案:

答案 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)