有一些for循环和list.append()的问题

时间:2014-01-04 20:07:31

标签: python arrays for-loop

以下是我正在运行的一些示例代码:

#!/usr/bin/python

x=[] 
for i in range(0,20):
    x.append(i) 
y=[] 
for i in x:
    y.append(-1*x[i])

for i in y:
    print i, y[i]

预期输出为:

0    0
1    -1
2    -2
3    -3
4    -4
5    -5
6    -6
7    -7
8    -8
9    -9
10    -10
11    -11
12    -12
13    -13
14    -14
15    -15
16    -16
17    -17
18    -18
19    -19

相反,我得到:

0 0
-1 -19
-2 -18
-3 -17
-4 -16
-5 -15
-6 -14
-7 -13
-8 -12
-9 -11
-10 -10
-11 -9
-12 -8
-13 -7
-14 -6
-15 -5
-16 -4
-17 -3
-18 -2
-19 -1

为什么会这样?

6 个答案:

答案 0 :(得分:3)

您可以使用enumerate获取所需的输出:

for i,val in enumerate(y):
    print (i, val)

您的问题是for i in y为您提供了y中的实际元素。然后在打印y [i]时使用这些作为索引。当你使用负数作为指数时,它会从列表末尾向后计数(因此y [-1]是列表中的最后一个值,y [-2]是倒数第二个,等等。)

答案 1 :(得分:1)

for i in y:
    print i, y[i]

打印i(来自y)和y [1],它们也访问y。我想你想要:

for i in x:
    print i, y[i]

如果有趣的话要注意,因为你的原始代码是将负数作为y的索引(即y [-1]),所以它从结尾获取元素并向后移动。乐趣。

答案 2 :(得分:1)

for i in y 生成索引。它生成已存储在y中的数字,范围从0到-19。这些负面索引然后重新应用y为您提供从列表末尾开始计算的索引。

换句话说,在第一次迭代中,y[0]0并打印0, 0。第二次迭代y[1]-1y[-1]y中的最后一个元素为-19,因为当使用负索引时,列表的长度被添加到索引中,因此打印-1 -19。等

将索引与列表值一起打印的Pythonic方法是使用enumerate();像这样:

for i, value in enumerate(y):
    print i, value

但你也可以做到:

for i in range(len(y)):
    print i, y[i]

答案 3 :(得分:0)

问题是由于在最后一个循环中for i in yi分配了每个,而不是索引。因此,i被分配了-1-2,...,-19等等。访问列表的负索引-i将返回从列表后面开始计算的第i个元素。

>>> [1, 2, 3, 4, 5, 6][-1]
6
>>> [1, 2, 3, 4, 5, 6][-4]
3

答案 4 :(得分:0)

试试这个(对最后一行进行更改):

x=[] 
for i in range(0,20):
    x.append(i) 
y=[] 
for i in x:
    y.append(-1*x[i])

for i in y:
    print x[-i], y[-i]

答案 5 :(得分:0)

意外输出是由最后一个循环引起的。

for i in y:

我正在循环y的值,这是您在第一列中看到的值

因为在这个循环中i的值是负数,所以你将得到从最后开始的索引,从-1开始等于最后一个元素,-2是倒数第二个,等等。当然零索引是非-ngative和索引从数组的开头

获取i的值,你期望你可以遍历x []中的值或y中的索引值范围

for i in x:
    print i, y[i]

for i in range(0,len(y)):
    print i, y[i]