我的功能完全按照我的要求运行,但对于我的课程工作,我必须将此功能转换为以下类:
solveIt
的函数,该类必须具有__str__()
函数,该函数返回这样的字符串。第一行是大小,第二行是以逗号分隔的元素列表:
10
4,1,9,2,0,4,4,4,3,7
我不太了解课程,所以任何帮助都将受到赞赏。这是我现在的功能:
from itertools import combinations
def com_subset_sum(seq, target):
if target == 0 or target in seq:
print(target)
return True
for r in range(len(seq),1,-1):
for subset in combinations(seq, r):
if sum(subset) == target:
print(subset)
return True
return False
print(com_subset_sum([4,1,9,2,0,4,4,4,3,7],10))
答案 0 :(得分:1)
将函数转换为类的一种显而易见的方法是将函数参数(或其中一些参数)转换为对象属性。例如:
class Knapsack(object):
def __init__(self, seq, target):
self.seq = seq
self.target = target
self.solution = None
def solveIt(self):
if self.target == 0 or self.target in self.seq:
self.solution = (target,)
return True, self.solution
for r in range(len(self.seq),1,-1):
for subset in combinations(self.seq, r):
if sum(subset) == self.target:
self.solution = subset
return True, self.solution
return False, ()
现在你可以这样做:
>>> knapsack = Knapsack([4,1,9,2,0,4,4,4,3,7],10)
>>> print(knapsack.solveIt())
(True, (4, 1, 2, 0, 3))
然后,添加__str__
方法很简单:
def __str__(self):
if self.solution is None:
self.solveIt()
return '{}\n{}'.format(len(self.seq),
','.join(map(str, self.solution)))
我添加self.solution
的原因是,一遍又一遍地调用__str__
不会一直反复计算结果。您可以轻松地删除该成员并写下:
def __str__(self):
solved, solution = self.solveIt()
return '{}\n{}'.format(len(self.seq),
','.join(map(str, solution)))
无论哪种方式,我都不确定这比功能更好。 (事实上,它严格地更糟糕:使用该函数,你总是可以使用functools.partial
来绑定序列,或者同时绑定序列和目标,或者当然两者都不绑定,而对于类,你总是必须在两者中绑定。)
也许你的教授给了你一些关于你如何使用这个可能有用的对象的提示?或者也许你的教授只是一个白痴,不知道如何为你教授关于课程的良好激励任务......