【问题标题】:Add items in a list until their sum exceeds a threshold在列表中添加项目,直到它们的总和超过阈值
【发布时间】:2020-02-08 06:28:17
【问题描述】:

我想从值列表中创建一个新的值列表,直到它们相加一个值。

我是 Python 新手,但我认为最好使用 while 循环。

L = [1,2,3,4,5,6,7,8,9]
i = 0
s = 0
while i < len(L) and s + L[i] < 20:
    s += L[i]
    i += 1

【问题讨论】:

  • 有效。有什么问题?
  • 我不明白问题本身,你想做什么?
  • 我认为他想要一个列表,其中的值总和达到该限制。
  • 你的新名单是L[:i]

标签: python list sum


【解决方案1】:

如果你从头到尾求和,(imo)更pythonic的方式将是

s = 0
for element in L:
   if s + element < 20:
         s += element
    else:
         break

【讨论】:

  • 补充:forif 请小写 - 在发布之前不要测试您的代码...?
  • 我解决了您的问题,在这种情况下,我只是将其从手机中丢弃,因此自动更正了大写字母
  • 我知道 - 自动更正真的很烦人,虽然我不得不说我在台式机上遇到同样的问题......关于测试:我也经常通过移动设备来这里,真的可以推荐Pydroid 3.
  • 谢谢我去看看
【解决方案2】:

您首先创建空列表,然后附加具有您声明的相同条件的值。最后打印该列表将返回您添加的符合您的条件的值:

L = [1,2,3,4,5,6,7,8,9]
i = 0
s = 0
new_list = []
while i < len(L) and s + L[i] < 20:
    new_list.append(L[i])
    s += L[i]
    i += 1
print(new_list)

输出:

[1, 2, 3, 4, 5]

【讨论】:

    【解决方案3】:

    自从你标记了 Pandas:

    pd.Series(L, index=np.cumsum(L)).loc[:20].values
    

    输出:

    array([1, 2, 3, 4, 5], dtype=int64)
    

    【讨论】:

      【解决方案4】:

      numpy 数组让这一切变得简单

      import numpy as np
      
      arr = np.array(L)
      arr[arr.cumsum() <= 20].tolist()
      #[1, 2, 3, 4, 5]
      

      【讨论】:

      • 仅供参考,如果第一个元素大于或等于 20,则会失败
      【解决方案5】:

      如果我们在谈论 pythonic,for 循环更有意义(也使用更好的变量名):

      data = [1,2,3,4,5,6,7,8,9]
      filtered = []
      for num in data:
          if num < 20:
              filtered.append(num)
      

      但推导式也是 Python 式的并且更短:

      filtered = [num for num in data if num < 20]
      

      然后只需使用sum 函数即可获得总和:

      total = sum(filtered)
      

      或者如果你只需要总和:

      total = sum(n for n in data if n < 20)
      

      【讨论】:

      • 这不会按预期工作 - 正在对每个元素进行测试。需要对元素的部分总和进行迭代测试。
      【解决方案6】:

      您可以轻松编写自己的生成器函数:

      L = [1,2,3,4,5,6,7,8,9]
      
      def takeuntil(lst, max_value = 0):
          """Yields elements as long as the cummulative sum is smaller than max_value."""
          total = 0
          for item in lst:
              total += item
              if total <= max_value:
                  yield item
              else:
                  raise StopIteration
      
          raise StopIteration
      
      new_lst = [item for item in takeuntil(L, 20)]
      print(new_lst)
      

      产量

      [1, 2, 3, 4, 5]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 2013-03-19
        • 2014-06-03
        • 1970-01-01
        相关资源
        最近更新 更多