-6

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

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 中相同的结果,我确定我缺少一些明显的东西

4

3 回答 3

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]
于 2013-08-11T14:57:48.930 回答
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]
于 2013-08-11T14:59:09.250 回答
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
于 2013-08-11T15:00:04.190 回答