繁体   English   中英

Python脚本,用于连续求和列表中的值

[英]Python script for summing values in list continuously

我正在尝试使函数“ add”能够连续对列表的元素求和并返回新的和列表。 在python中,有时输入不是列表,或者其中有其他对象而不是整数,例如字符串或浮点数,在这种情况下,我必须返回“无效输入”

例如:

add([1,2,3,4,5]) == [1, 3, 6, 10, 15] , because it's calculated like this : [1, 1 + 2, 1 + 2 + 3, 1 + 2 + 3 + 4, 1 + 2 + 3 + 4 + 5]

add([1,'a',2,'b',3,'c']) == 'Invalid input'

add('All string') == 'Invalid input'

add((1,2,3,4)) == 'Invalid input'

我该怎么做?

numpy cumsum可能最适合您要查找的内容:

import numpy

data = numpy.array([ndx**2 for ndx in range(10)])
numpy.cumsum(data)

输出:

array([  0,   1,   5,  14,  30,  55,  91, 140, 204, 285])

这有两个层次。


  1. 查找列表中的元素是否全部为int

     >>> all(isinstance(ele , int) for ele in l) 

    如果false打印无效 ; 否则继续进行计算。


  1. 给出先前元素的累积总和:

     >>> [sum( l[:i+1] ) for i in range(len(l))] 

#driver值:

IN : l = [1,2,3,4,5]
OUT : True                          #all ints
      [1, 3, 6, 10, 15]

IN : l = [1,'a',2,'b',3,'c']
OUT : False                        #not int
      Invalid input

或者,遵循try/except方法的更简单方法:

try : 
     print([sum( l[:i+1] ) for i in range(len(l))]) 
except : 
     print("Invalid Input") 

使用itertools.accumulate来获取总和,后跟any(isinstance(i,str) for i in list)以验证是否有任何元素为字符串

from itertools import accumulate

l1 = [1,2,3,4,5]
print ("Invalid input" if any(isinstance(i, str) for i in l1) else list(accumulate(l1)))
#[1, 3, 6, 10, 15]

l2 = [1,2,3,'str',5]
print ("Invalid input" if any(isinstance(i, str) for i in l2) else list(accumulate(l2)))
#Invalid input

放入功能:

def cumsum(l):
    if any(isinstance(i, str) for i in l):
        print ('Invalid input')
    else:
        print (list(accumulate(l1)))

cumsum([1,2,3,4,5])
#[1, 3, 6, 10, 15]
cumsum([1,2,3,'str',5])
#Invalid input
def add_up(nums):
   if any(not isinstance(n, int) for n in nums):
      return 'Invalid input'
   def gen():
      n = nums[0]
      yield n
      for i in nums[1:]:
          n = i + n
          yield n
   return list(gen())
结果
 add_up([1,2,3,4,5]) [1, 3, 6, 10, 15] add_up([1,'a',2,'b',3,'c']) 'Invalid input' add_up('All string') 'Invalid input' add_up(['a','b','c']) 'Invalid input' add_up(range(10)) [0, 1, 3, 6, 10, 15, 21, 28, 36, 45] 

我们可以使用numpy cumsum来获取累积值列表。

import numpy as np
def cumSum(arr):
    try:
        return (list(np.cumsum(arr)))
    except:
        return "inValid"
a = [1,2,3,4,5]
print(cumSum(a))

上面的代码片段输出是

[1, 3, 6, 10, 15]
from itertools import accumulate

def add(input):
    if all(isinstance(i,int) for i in  input):
        return list(accumulate(input))
    else:
        return "invalid input"

这是仅汇总有效int或float列表的方法

def add(lis):
    if not isIntList(lis) or type(lis) is not list:
       return False
    return [sum(lis[:x+1]) for x in range(len(lis))]

该方法检查列表中的值是int还是float值

def isIntList(list):
    for i in list:
        if not isinstance(i, int) and not isinstance(i, float):
            return False
    return True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM