2017-08-29 54 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] 

所需的輸出將是:

x = [1.0, 7.0, 14.0, 0.0, 0.0, 6.0, 0.0, 3.0] 

其中對於索引2,將總結對14(2,4,和8)。對於沒有出現在a['index']中的任何索引,將在x中分配0

我試圖通過一個新的x行重複a[index,values]行,長度爲零的值爲n。如果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是一樣的設置它到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 

並返回你所期望的:

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

還有一個區別期望的輸出,整數0被用來代替浮動0.的。這可以通過用x = [0.] * n代替x = [0] * n來容易地解決。

在更廣泛的注意事項:

你應該用更有意義的變量名狀dct而不是a什麼n應該是指僅僅是超越我。一個名爲newlist的函數也不是很豐富。

+0

啊哈。這使得它變得更簡單了。謝謝 – GenXeral