【问题标题】:Sum of random list numbers after 1st negative number第一个负数之后的随机列表数字的总和
【发布时间】:2022-01-03 15:37:14
【问题描述】:
import random

def mainlist(list, size, min, max):
    for i in range(size):
        list.append(random.randint(min, max))
    print(list)

def counterlist(list):
    for i in list:
        if i<0:
            x=sum(list[(list.index(i)+1):])
            print('Reqemlerin cemi:', x)
            break
       
     
list = []
mainlist(list, 10, -10, 30)
counterlist(list)

我需要计算这个随机列表中第一个负数之后的数字总和,在第二个函数中做了,但想知道有没有不使用 sum() 函数的方法?

【问题讨论】:

  • 您始终可以遍历列表中的其余元素,并不断添加这些元素的值。如果你不想使用sum函数
  • 到目前为止您尝试了什么,您的尝试出了什么问题?
  • 我已经尝试迭代元素并添加它们的值,但仍然不起作用。

标签: python list numbers


【解决方案1】:

显式使用迭代器使其更好、更高效:

def counterlist(lst):
    it = iter(lst)
    for i in it:
        if i < 0:
            print('Reqemlerin cemi:', sum(it))

不知道你为什么不想使用sum 函数,这绝对是正确和最好的方法。

【讨论】:

    【解决方案2】:

    试试这个:

    import random
    
    lst = [random.randint(-10, 30) for _ in range(10)]
    print(sum(lst[next(i for i, n in enumerate(lst) if n < 0) + 1:]))
    

    首先生成列表lst。然后,您遍历您的列表,并找到带有next(i for i, n in enumerate(lst) if n &lt; 0) 的第一个否定元素。最后,计算您感兴趣的列表部分的总和。

    如果您真的不想使用 sum 但要保持简洁(并且您使用的是 python >= 3.8):

    import random
    
    lst = [random.randint(-10, 30) for _ in range(10)]
    s = 0
    print([s := s + x for x in lst[next(i for i, n in enumerate(lst) if n < 0) + 1:]][-1])
    

    【讨论】:

    • 我尝试了你的第一个解决方案,它崩溃了(说StopIteration)。
    • 您的第二个解决方案有同样的问题。此外,还不清楚您为什么将他们的 index 调用替换为 enumerate,因为它的代码更长,速度也更慢。
    • 谁能读懂。我认为编程最重要的方面是清晰,而这显然是不清楚的。
    【解决方案3】:

    假设列表中有一个负值,并且带有一个测试列表“a”:

    a = [1,2,3,-7,2,3,4,-1,23,3]
    sum(a[(a.index([i for i in a if i < 0][0]) + 1):])
    

    按预期计算为 34。如果没有负值,也可以添加一个带有简单总和的 try/except IndexError。

    编辑:更新了搜索的索引。

    【讨论】:

      【解决方案4】:

      是的,您可以遍历列表中的元素并继续将它们添加到某个 var 中以存储您的结果。但是为了什么? sum 方法更加清晰和 python 风格。

      另外,不要使用list 作为列表名称,它是一个保留字。

      # After you find a first negative number (at i position)
      j = i + 1
      elements_sum = 0
      while j < len(list):
          elements_sum += list[j]
          j += 1
      

      【讨论】:

        【解决方案5】:

        不如标记的答案,只是为了知道如何使用numpy,确保列表中有一个负数。

        示例列表:lst = [12, 2, -3, 4, 5, 10, 100]

        您可以使用np.cumsum 获得结果:

        import numpy as np
        
        np_lst = np.array(lst)
        cum_sum = np.cumsum(np_lst)
        res = cum_sum[-1] - cum_sum[np_lst<0][0]
        res #=> 119
        

        【讨论】:

          【解决方案6】:

          首先不要使用list作为变量名,它是一个保留关键字。其次,使您的循环如下:

          for index, x in enumerate(list_):
              if x < 0:
                  sum_ = sum(list_[(index + 1):])
                  print('Reqemlerin cemi:', sum_)
                  break
          

          这样,您不需要找到值。

          最后如果你不想使用sum

          found_negative = false
          sum_ = 0
          for x in list_:
              if found_negative:
                  sum_ += x
              elif x < 0:
                  found_negative = true
                  
          print('Reqemlerin cemi:', sum_)
          

          【讨论】:

            猜你喜欢
            • 2015-03-01
            • 2022-01-03
            • 2018-04-22
            • 2013-06-07
            • 2015-08-06
            • 1970-01-01
            • 2015-10-26
            • 1970-01-01
            • 2011-04-19
            相关资源
            最近更新 更多