如何从两个列表中获取参数,使任何函数的值最大?

时间:2017-03-30 12:14:07

标签: python list

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的技巧?

2 个答案:

答案 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"的所有结果的总结。请尽量写清楚。