【问题标题】:Sum as long as sum doesn't exceed a value求和,只要总和不超过一个值
【发布时间】:2018-05-25 17:58:31
【问题描述】:

我有一个从 0.5、1-2...7 的特定值的卡片列表。 每次循环从列表中随机选择一张卡片时,我都需要选择并尽可能多次地求和,但总和不能超过sum < 7.5并且每次我必须从列表中弹出卡片时。

我试过这样: (switcher是一个函数,它找到一张卡片的值并将其和sum相加)

    while sum < 7.5:
        card_picked = cards[random.randrange(len(cards))]
        sum = switcher(card, sum)
        card_index = cards.index(card)
        cards.pop(card_index)

但这每次都会给我一个大于 7.5 的值。 有什么想法吗?

【问题讨论】:

  • switcher 返回sum?
  • 那是因为你的循环只会在你已经超过总和之后停止,你需要测试如果你真的选择了新卡,总和会是多少,然后停止在你把它加到总和之前。

标签: python-3.x list loops


【解决方案1】:

您可以简单地洗牌,而不是一次选择一张牌,并且总是pop() 第一张 - 这比随机挑选一张并稍后将其编入索引要好:

import random

cards = [.5,1,2,3,4,5,6,7]

# shuffle the whole cards list into a new random configuration
pickings = random.sample(cards,k=len(cards)) 

s = 0
c = []
while True: # they eventually add up to more then 7.5 so no need to check for empty list
    card = pickings.pop(0) # get first
    if s + card < 7.5:     # can add?
        s += card            # do so
        c.append(card)       # and to list so we see the cards collected
    else:
        print("cant take ", card) # cant, break while
        break

print ("Sum:",s)
print(c)

一些运行:

cant take  4
Sum: 3.5
[3, 0.5]

cant take  3
Sum: 5
[4, 1]

cant take  7
Sum: 2.5
[0.5, 2]

【讨论】:

    【解决方案2】:

    你正在添加到sum(顺便说一下,最好重命名,因为你在那里掩盖了内置函数sum()的名称)和然后,下一步当你到达循环的顶部时,你正在检查它是否超过了限制。因此,当且仅当它 已经 结束时,您才退出循环。所以很自然地,你总是会在拥有sum &gt; 7.5 的状态下退出循环。您可以重新制定您的while 条件,以便在新卡值已知之后、sum 更新之前对其进行评估。或者您可以保持原样,但跟踪添加的最后一张卡片:然后,一旦您在循环之外,从 sum 中减去它的值,然后将卡片放回牌组。

    【讨论】:

      猜你喜欢
      • 2021-07-26
      • 2017-04-19
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2016-06-26
      相关资源
      最近更新 更多