我正在尝试搜索列表列表的排列,对每个排列进行评分,并找到最小值。当列表列表的长度为4时,我可以通过硬编码解决方案来实现。我的问题是如何将我的解决方案概括为任何长度达50?如何避免编写一系列for循环?
answer = {}
l=[[16,5,6],[6,3,4],[5,1,2],[10,1,4]]
lowest = get_expected_value(l)
for x in l:
for y in l:
for z in l:
for a in l:
if x != y and x != z and x != a and y != z and y != a and z != a:
if get_expected_value([x,y,z,a]) <= lowest:
answer[get_expected_value([x,y,z,a])] = [x,y,z,a]
lowest = get_expected_value([x,y,z,a])
print ans[min(ans.keys())]
get_expected_value
定义如下:
def get_expected_value(list_minions):
expected = 0
for item in xrange(len(list_minions)):
if item == 0:
expected += list_minions[0][0]
else:
expected += (list_minions[item][0])*(1.0 - (list_minions[item-1][1]/float(list_minions[item-1][2])))
return expected
答案 0 :(得分:1)
这是一个处理任意长度的列表l
的解决方案(并不总是在@mhum指出的任何合理时间内完成)
使用相同的get_expected_value
函数。
from itertools import permutations
l = ((16,5,6),(6,3,4),(5,1,2),(10,1,4)) # in general, you should choose a different letter than `l` for variable names, as it can be confused with `1`
print min(permutations(l), key=get_expected_value)
关键的想法是利用itertools
'permutation
生成器函数来完成获取列表l
的所有扩展的肮脏工作。
最后,您可以使用key
的{{1}}关键字参数来指定您想要的最小值,而不是自己跟踪最小值。
给定对象集合的最小值(在这种情况下,对象是min
的排列),其中“值”由
与l
相关联的功能,在本例中为key
。所以我们有: