2017-02-23 75 views
0

我想解決如何編寫一個算法來計算跨不同列表的權重最有效的方法。我有一個包含各種IDS的字典:矩陣權重算法

x["Y"]=[id1,id2,id3...] 
x["X"]=[id2,id3....] 
x["Z"]=[id3] 
. 
. 

我有一個相關的權重爲每個元素:

w["Y"]=10 
w["X"]=10 
w["Z"]=5 

考慮說「Y」的輸入,「Z」我想的輸出,給我

(id1,10),(id2,10),(id3,15)

ID3得到15,因爲它是在x [ 「Y」]和x 7 「Z」 ]

有沒有辦法讓我可以做到這與矢量matracies?

+0

ID2是在x [ 「X」]和x 7」 Y「],那麼它應該是(id2,20)呢? –

+0

沒有輸入是Y和Z,所以它只查看x [「Y」]和x [「Z」]的所有ID。 Id2從x [「Y」]得到10,它不在x [「Z」]中,因此不再有任何更多 – MarMan29

回答

2

您可以在列表中使用itertools庫組一起共同條款:

import itertools 
import operator 

a = {'x': [2,3], 'y': [1,2,3], 'z': [3]} 
b = {'x': 10, 'y': 10, 'z': 5} 

def matrix_weight(letter1,letter2): 
    final_list = [] 
    for i in a[letter1]: 
     final_list.append((i, b[letter1])) 
    for i in a[letter2]: 
     final_list.append((i, b[letter2])) 

    # final_list = [(1,10), (2,10), (3,10), (3,5)] 
    it = itertools.groupby(final_list, operator.itemgetter(0)) 
    for key, subiter in it: 
     yield key, sum(item[1] for item in subiter) 

print list(matrix_weight('y', 'z')) 
1

我將在您的示例中使用字符串中的id,但整數id的作用類似。

def id_weights(x, w, keys): 
    result = {} 
    for key in keys: 
     for id in x[key]: 
      if id not in result: 
       result[id] = 0 
      result[id] += w[key] 
    return [(id, result[id]) for id in sorted(result.keys())] 

x = {"Y": ["id1","id2","id3"], 
    "X": ["id2", "id3"], 
    "Z": ["id3"]} 
w = {"Y": 10, "X": 10, "Z": 5} 

if __name__ == "__main__": 
    keys = ["Y", "Z"] 
    print id_weights(x, w, keys) 

[('id1', 10), ('id2', 10), ('id3', 15)]