0

編集:回答ありがとうございます。これは役に立ちますが、私の問題の核心に到達しているかどうかはわかりません。場合によっては、リストの下位を選択してそれに応じて値を追加するだけでよい場合もありますが、この場合、実際には不均一なリストを短い方のリストに欠落している値がゼロであるかのように扱いたいと考えています。[1, 2, 3] + [1, 2] を [1, 2, 3] + [1, 2, 0] として機能させたいのです。zip や演算子を逆にしても、これが達成されるとは思いません。

2 つのリストの対応する値を追加し、2 つの元のリストの各インデックスの合計を含む新しいリストを返す関数を作成しようとしています。

def addVectors(v1, v2):
    print(v1[0], v1[1], v2[0])
    newVector = []
    if len(v1) > len(v2):
        for index in range(len(v1)):
            print(index)
            newVector[index] += v1[index] + v2[index]
    else:
        for index in range(len(v2)):
            print(index)
            newVector[index] += v2[index] + v1[index]
    return newVector


addVectors([1, 2, 3], [1, 2])

それでも、リストのインデックスが範囲外であるというエラーが表示されますか? この一見単純なプログラムで何が間違っているのかわかりません....

4

7 に答える 7

7

あなたはおそらく行を変更するつもりでした:

if len(v1) > len(v2):

に:

if len(v1) < len(v2):

これにより、 v1が短い場合に、v1の要素数を反復処理することになり、エッジを超えないようになります。

は長さ0のリストであり、その範囲外にアクセスしているため、これエラーをスローすることに注意してください。newVectorあなたは変更する必要があります

newVector[index] += v1[index] + v2[index]

newVector.append(v1[index] + v2[index])

ただし、これは次のようにはるかに簡単に実行できることに注意してください。

def addVectors(v1, v2):
    return map(sum, zip(v1, v2))

ETA:リストをゼロで埋めるには、次のようにします。

import itertools
def addVectors(v1, v2):
    return map(sum, itertools.izip_longest(v1, v2, fillvalue=0))

例えば:

addVectors([1, 2, 3, 4, 5], [1, 2])
# [2, 4, 3, 4, 5]
于 2012-09-20T21:12:14.733 に答える
4

これだけ使ってみませんか?

def sum_lists(a, b):
    return [x[0] + x[1] for x in zip(a, b)]

sum_lists([1, 2, 3], [4, 5, 6])    # -> [5, 7, 9]
于 2012-09-20T21:12:44.670 に答える
2

リストの長さを比較しますが、これは正しいです。ただし、必要な操作を変更します。つまり、list1がlist2よりも長い場合は、list2の長さの要素のみをループする必要があります。

于 2012-09-20T21:13:15.293 に答える
2

不均一な長さのリストを埋めるには、次を使用できますitertools

>>> import itertools
>>> map(sum, itertools.izip_longest([1,2,3], [1,2], fillvalue = 0))
[2, 4, 3]
于 2012-09-20T21:29:04.037 に答える
1

あなたの問題はここにあります:

if len(v1) > len(v2):
    for index in range(len(v1)):
        print(index)
        newVector[index] += v1[index] + v2[index]

あなたはそれを確実にしますlen(v1) > len(v2)が、それから繰り返しrange(len(v1))ます。

あなたの例ではv2[2]、存在しないにアクセスしようとしています。

アップデート:

編集に応じて、次のようなものを使用できます。

def addVectors(v1, v2):
    if len(v1) > len(v2):
        map(sum, zip(v1, v2)).extend(v1[len(v2):])
    else:
        map(sum, zip(v1, v2)).extend(v2[len(v1):])
于 2012-09-20T21:14:19.210 に答える
0

あなたの IndexError は、 newVector が空のリストのときに newVector[index] に書き込もうとしているためです。一連のゼロに初期化するか、代わりに追加を使用する必要があります。

>>> first = [1,2,3]
>>> second = [1,2]
>>> output = []
>>> for i, item in enumerate(first):
...   additional = second[i] if i < len(second) else 0
...   output.append(item + additional)
...
>>> output
[2, 4, 3]

len(first) > len(second) であることを確認するには、次のようにします。

first, second = first, second if len(first) > len(second) else second, first
于 2012-09-20T22:00:57.050 に答える