any_func=lambda x,y:x/(y+1)
list1=[1,2,3,4,5,6,7,8]
list2=[4,5,6,7,9,2,3,5,7,8]
我有两个列表list1和list2,我想要步骤1:从两个列表中获取元素对,使得函数any_func具有最大值,并且步骤2:然后从原始列表中删除这两个元素,继续步骤1和步骤2直到list1或list2为空,any_func的所有结果的总和。 有没有python的技巧?
答案 0 :(得分:1)
听起来您正在寻找2个列表中的笛卡尔积,itertools.product()
为您提供笛卡尔积。
如果您需要max
,那么key
max()
参数定义了您评估最大值的方式:
>>> import itertools as it
>>> max(it.product(list1, list2), key=lambda x: any_func(x[0], x[1]))
(8, 2)
然而,听起来你只想要这个产品的sum
:
>>> sum(any_func(a, b) for a, b in it.product(list1, list2))
61.94285714285714
答案 1 :(得分:0)
我希望我能从你的问题中理解得很清楚。我使用的技巧是构造一种矩阵:
I = [ list1[ 0] , list1[ 0] , ... , list1[ 0] , list1[ 1] , list1[ 1] , ... ]
J = [ list2[ 0] , list2[ 1] , ... , list2[-1] , list2[ 0] , list2[ 1] , ... ]
被评估。结果存储在一个列表中。当时唯一剩下的就是重新构建原始索引,我们使用这样一个事实:我们知道list2
的每个项都会重复list1
。
以下是我的观点:
# some function to evaluate
any_func = lambda x,y : x/(y+1)
# some input data
list1 = [1,2,3,4,5,6,7,8]
list2 = [4,5,6,7,9,2,3,5,7,8]
total = 0.
# loop until one of the lists is empty
while len(list1)>0 and len(list2)>0:
# construct a lists of all combinations of "list1" and "list2", evaluate func.
list_func = [any_func(i,j) for i in list1 for j in list2]
# find the index of the maximum and trace back to list-index
idx_max = max(enumerate(list_func),key=lambda x:x[1])[0]
idx_2 = idx_max%len(list2)
idx_1 = int((idx_max-idx_2)/len(list2))
# add to the requested summation
total += list1[idx_1]+list2[idx_2]
# take elements for lists
list1 = list1[:idx_1]+list1[idx_1+1:]
list2 = list2[:idx_2]+list2[idx_2+1:]
print('list1 = ',list1)
print('list1 = ',list2)
P.S。我不明白你的意思",any_func"的所有结果的总结。请尽量写清楚。