如果一个变量有两个可能的结果,如何从列表中单独添加值

时间:2016-10-08 23:31:25

标签: python list python-3.x sum

这个赋值调用另一个函数:

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。

2 个答案:

答案 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函数的不同实现),它可能非常有趣。