我有一个数字对列表,如下所示:

my_list = [(0,9),(1,5),(0,12),(2,8),(1,13),(2,17)]


我需要基于每对第一个数字的点积作为匹配键。换句话说,我将乘以912,因为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初学者。

最佳答案

这可以通过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

关于python - 数字对列表-需要乘积和求和的策略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25103028/

10-12 20:22