-6

次のコードが機能している2乗したい2つのリストがあります

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]

2 つの 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

したがって、コードは値をインデックスとして使用して要素をフェッチし、それらの値の 2 乗を返します。これが起こることです -

>>> 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 に答える