for循环返回意外值时for循环值

时间:2013-08-11 14:56:26

标签: python

我有两个我希望平方的列表 以下代码正在运行

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

b = [1, 3, -4, 5, 5, 3, 2, 1, 4, 8, 9]
a_sqrd = []
b_sqrd = []
for i in a:
    a_sqrd.append(a[i]*a[i])
    b_sqrd.append(b[i]*b[i])

print a_sqrd
print b_sqrd

结果:

[0,1,4,9,16,25,36,49,64,81,100]

[1,9,16,25,25,9,4,1,16,64,81]

但是当我尝试

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

b = [1, 3, -4, 5, 5, 3, 2, 1, 4, 8, 9]
a_sqrd = []
b_sqrd = []
for i in a:
    a_sqrd.append(a[i]*a[i])
for i in b:
    b_sqrd.append(b[i]*b[i])

print a_sqrd
print b_sqrd

结果:

[0,1,4,9,16,25,36,49,64,81,100]

[9,25,1,9,9,25,16,9,25,16,64]

为什么运行两个for循环影响列表b? 我期待与a中相同的结果,我确定有一些明显的遗漏

3 个答案:

答案 0 :(得分:4)

使用for elem in testList迭代列表,这会产生列表的元素,而不是它们的索引。

>>> b = [1, 3, -4, 5, 5, 3, 2, 1, 4, 8, 9]
>>> for i in b:
        print i,


1 3 -4 5 5 3 2 1 4 8 9 # Whereas you expected 0 1 2 3 4 5 6 7 8 9 10

因此,您的代码使用值作为索引来获取元素,并返回这些值的平方。这就是发生的事情 -

>>> for index, val in enumerate(b): # enumerate yields an (index, value) tuple which gets unpacked.
        print '{0} : {1}*{1} = {2}'.format(index, val, val**2)


0 : 1*1 = 1
1 : 3*3 = 9
2 : -4*-4 = 16
3 : 5*5 = 25
4 : 5*5 = 25
5 : 3*3 = 9
6 : 2*2 = 4
7 : 1*1 = 1
8 : 4*4 = 16
9 : 8*8 = 64
10 : 9*9 = 81

在您的初始代码中, a列表恰好是您期望的列表,它会按照您的观察结果构建正确的列表。

更轻松的解决方案 -

您可以使用列表推导来构建列表,例如(如果您正在查找它的正方形,则无需自己乘以数字,只需使用内置指数运算符(**))

>>> [elem**2 for elem in a]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> [elem**2 for elem in b]
[1, 9, 16, 25, 25, 9, 4, 1, 16, 64, 81]

使用map的解决方案。

>>> map(lambda x: x**2, a)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> map(lambda x: x**2, b)
[1, 9, 16, 25, 25, 9, 4, 1, 16, 64, 81]

答案 1 :(得分:2)

您可以更轻松地使用列表理解:

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a_sqrd=[e*e for e in a]
>>> a_sqrd
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> b = [1, 3, -4, 5, 5, 3, 2, 1, 4, 8, 9]
>>> b_sqrd=[e*e for e in b]
>>> b_sqrd
[1, 9, 16, 25, 25, 9, 4, 1, 16, 64, 81]

答案 2 :(得分:0)

此代码没有按照您的想法执行:

for i in a:
    ...

因为i值是数组中的实际值。

您没有注意到,因为第一个数组中的数组值为0,1,2,3,4,5...

因此,在您的代码中,您需要将其更改为:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

b = [1, 3, -4, 5, 5, 3, 2, 1, 4, 8, 9]
a_sqrd = []
for i in a:
    a_sqrd.append(i**2)

print a_sqrd

或打扰他们;

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [1, 3, -4, 5, 5, 3, 2, 1, 4, 8, 9]
a_sqrd = []
b_sqrd = []
for i, j in zip(a, b):
    a_sqrd.append(i**2)
    b_sqrd.append(j**2)

print a_sqrd
print b_sqrd