list1的= [1,2,3,4,5,6,7] list2中= [6,4,5] 我想计算两个列表中第i个最大元素对的乘法,然后计算结果的总和,如6 * 7 + 5 * 6 + 4 * 5。 是否存在短编码的python技巧。
答案 0 :(得分:0)
>>> a=[1,2,3,4,5,6,7]
>>> b=[6,4,5]
>>> sum([x*y for x,y in zip(sorted(a, reverse=True), sorted(b, reverse=True))])
92
或
sum(map(lambda a, b: a*b, sorted(a, reverse=True), sorted(b, reverse=True)))
没有特殊的技巧,熟悉python中的一些常见函数,例如map
,sum
,sorted
,lambda
或更多{{3 }和itertools。并学习一些functools ...
答案 1 :(得分:0)
list1=[1,2,3,4,5,6,7]
list2=[6,4,5]
sum(reduce(lambda a,b:a*b, i, 1) for i in zip(sorted(list1, reverse=True), sorted(list2, reverse=True)))
>>> 92
答案 2 :(得分:0)
你可以这样试试......
list1=[2,3,4,5,7,1,6]
list2 = [4,6,5]
list1 = sorted(list1,reverse = True)
list2 = sorted(list2, reverse=True)
sum = 0
length = min(len(list1),len(list2))
for i in range(length):
sum =sum + list1[i]*list2[i]
print sum
答案 3 :(得分:0)
已经发布了一些下降答案,但我想扩展一些@delta所提到的functools和itertools的额外功能。 Python 2.x解决方案:
from functools import partial # helps with less typing & faster lookup
from itertools import izip # izip is a lazy memory efficient version of zip
In [33]: list1, list2 = [1,2,3,4,5,6,7], [6,4,5]
In [34]: des_sort = partial(sorted, reverse=True) #
In [35]: sum(a*b for a,b in izip(des_sort(list1), des_sort(list2)))
Out[35]: 92
注意使用sum([...])使用生成器表达式而不是列表理解来执行sum()。
有更多数学密集型操作的numpy / pandas路线;对于小型列表来说速度较慢,但对于大型numpy ndarray类型有效。
当然,所有速度/内存优势仅适用于较大的数据集,否则任何其他解决方案都可以正常工作。
In [39]: import pandas as pd
In [40]: pd.DataFrame([des_sort(list1), des_sort(list2)]).fillna(0).prod().sum() # performs dot product
Out[40]: 92.0