我有一个数字对列表如下:
my_list = [(0,9),(1,5),(0,12),(2,8),(1,13),(2,17)]
我需要基于每对的第一个数字作为匹配键的点积。换句话说,我会将9
和12
相乘,因为0
匹配。我将此放在一边并添加下一个匹配项的产品(5 * 13
,因为它们匹配值1
)。
我有一个丑陋的解决方案,需要我知道列表的长度:
print my_list
dotproduct = 0
i = 0
for ml1 in my_list:
for ml2 in my_list:
if ml1[0] == ml2[0] and ml1[1] != ml2[1] and i < 4:
print 'multiply ',ml1[1] ,' and ', ml2[1]
dotproduct += ml1[1] * ml2[1]
print 'count = ', i
i += 1
print dotproduct
这也只有在产品的操作数不相等时才有效。简而言之,当集合的长度已知并且产品操作数不同时,它可以工作。相当弱。
如果不是很明显,我是一个初学的Python人。
答案 0 :(得分:6)
这可以通过collections.defaultdict
非常简单地完成:
from collections import defaultdict
out = defaultdict(lambda: 1)
for key, val in my_list:
out[key] *= val
dotproduct = sum(out.values())
对于您的示例输入,这会给我dotproduct == 309
。