2017-08-29 3 views
2

インデックスと値を格納し、新しいリストに変換するベクトルデータ構造aを使用する関数を記述しようとしています。新しいリストは、重複したインデックスですべての値を合計します。さらに、aは任意の長さにすることができます。例えばインデックスと値を持つベクトルデータ(辞書)からリストを作成する機能

a = {'index': [], 'value': []} 
a['index'] = [0, 2, 7, 2, 2, 5, 1] 
a['value'] = [1.0, 2.0, 3.0, 4.0, 8.0, 6.0, 7.0] 

所望の出力は次のようになります。

インデックス2ために、それは14(2、4、8)までの合計になる
x = [1.0, 7.0, 14.0, 0.0, 0.0, 6.0, 0.0, 3.0] 

a['index']に表示されないインデックスの場合は0xが割り当てられます。

私は、新しいx行にわたり、長さnのゼロ値を持つ繰り返しを試しています。a[index,values]x[i]がすでに存在する場合は、既存の値に加算されます。

def newlist(a, n=None): 
    i_max = max(a['index']) if a['index'] else -1 
    if n is None: 
     n = i_max+1 
    else: 
     assert n > i_max, 

    x = [0] * n 
    for i, v in zip(a['index'], a['value']): 
     if x[i] in a['index']: 
      x[i]+=v 
     else: 
      x[i]=v 
    return x 

答えて

2

0+vを設定することと同じですので、あなたは常にだけ(値を追加できるようにリストがすでにゼロが含まれています。私は私のfor文は、オフ少しですが、私は構文的にそれを修正するかどうかはわかりません知っていますそれはvに)。

def newlist(a, n=None): 
    i_max = max(a['index']) if a['index'] else -1 
    if n is None: 
     n = i_max+1 
    else: 
     assert n > i_max 

    x = [0] * n 
    for i, v in zip(a['index'], a['value']): 
     x[i] += v 
    return x 

を、それはあなたが期待するものを返します:その修正と機能は次のようになり所望の出力に1つの違いがあります

>>> newlist(a) 
[1.0, 7.0, 14.0, 0, 0, 6.0, 0, 3.0] 

、整数0は、フロート0.の代わりに使用されます。これは、x = [0] * nx = [0.] * nに置き換えることで簡単に修正できます。より一般的なノートで

あなたはdct代わりのaのような、より意味のある変数名を使用する必要がありますし、何nを意味すべきは、ちょうど私を超えています。 newlistという名前の関数はあまり有益ではありません。

+0

ああ。それはそれよりずっと簡単です。ありがとう – GenXeral

関連する問題