这个赋值调用另一个函数:
def getPoints(n):
n = (n-1) % 13 + 1
if n == 1:
return [1] + [11]
if 2 <= n <= 10:
return [n]
if 11 <= n <= 13:
return [10]
所以我的任务要求我从52个数字列表中的数字中添加所有可能点的总和。到目前为止,这是我的代码。
def getPointTotal(aList):
points = []
for i in aList:
points += getPoints(i)
total = sum(points)
return aList, points, total
然而问题是整数1有两个可能的点值,1或11.当我做点的总和时,它正确地完成所有事情,但是它将1和11加在一起,而我需要它来计算总和整数是1,如果整数是11。
例如:
>>>getPointTotal([1,26, 12]) # 10-13 are worth 10 points( and every 13th number that equates to 10-13 using n % 13.
>>>[21,31] # 21 if the value is 1, 31 if the value is 11.
另一个例子:
>>>getPointTotal([1,14]) # 14 is just 14 % 13 = 1 so, 1 and 1.
>>>[2, 12, 22] # 1+1=2, 1+11=12, 11+11=22
我的输出是:
>>>getPointTotal([1,14])
>>>[24] #It's adding all of the numbers 1+1+11+11 = 24.
所以我的问题是,我如何使它与值11分开添加值1,反之亦然。因此,当我有1时,它将添加所有值和1或它将添加所有值和11。
答案 0 :(得分:4)
存储从getPoints()
返回的所有值时出错。您应该只存储到目前为止返回的点的可能总数。您可以将所有这些存储在一个集合中,并使用从getPoints()
返回的所有可能值进行更新。一组将自动删除重复的分数,例如1 + 11和11 + 1。您可以在最后将设置更改为排序列表。这是我的代码:
def getPointTotal(aList):
totals = {0}
for i in aList:
totals = {p + t for p in getPoints(i) for t in totals}
return sorted(list(totals))
我得到了这些结果:
>>> print(getPointTotal([1,26, 12]))
[21, 31]
>>> print(getPointTotal([1,14]))
[2, 12, 22]
答案 1 :(得分:1)
Rory Daulton的答案很好,它可以有效地为您提供不同的总数。我想提供另一种方法,不一定比那种更好,只是有点不同。我的方法的好处是你可以看到导致给定总数的分数序列,而不仅仅是最后的总数。
def getPointTotal(cards):
card_scores = [getPoints(card) for card in cards] # will be a list of lists
combos = {sorted(scores) for scores in itertools.product(*card_scores)}
return [(scores, sum(scores)) for scores in combos]
此代码的关键部分是对itertools.product(*card_scores)
的调用。这将获取您从getPoints
获得的列表,用于输入列表中的每张卡片,并获取所有组合。因此product([1, 11], [1, 11], [10])
会提供(1, 1, 10)
,(1, 11, 10)
,(11, 1, 10)
和(11, 11, 10)
。
对于二十一点得分而言,这可能有点过分,因为对于给定的一组牌,得分不会有很多变化。但是对于一个不同的问题(即getPoints
函数的不同实现),它可能非常有趣。