2017-09-02 75 views
0

我应该创建一个函数,该函数在不使用任何python模块的情况下添加大于特定数字的数字的绝对值。我写了这个:尝试从矩阵中添加特定值而不使用numpy

def MatrixSumLarge(vals,large): 

    sum=0 
    sum1=0 
    sum2=0 
    i=0 

    #looking at the rows of the matrix 
    for i in range(len(vals[i])): 
     if abs(vals)>=large: 
      sum1=sum1+i 

     #lookinng at the columns of the matrix 
     for j in range(0,len(vals[j])): 

      if abs(vals[j])>=large: 
       sum2=sum2+vals[j] 

    sum=sum1+sum2 

    return(sum) 

vals=[[1,-2.5,7,4],[-8,9,2,-1.5],[-12,7.5,4.2,11]] 

# setting value of large 
large = 7.1 

#to print the final answer 
print('b) Sum of Large Values = ',MatrixSumLarge(vals,large)) 

,并得到了错误:

TypeError: bad operand type for abs(): 'list'

回答

0

vals是列表的列表,所以vals[i]是一个列表。但是,abs()不能应用在列表上,它应该应用于一个数字(浮点数,整数或复数)上,请参阅official document here。例如,您可以添加一个额外的循环来合并行中的元素,如sum(abs(x) for x in vals[i] if x >= 2)

您可以将2更改为所需的数字。

总体而言,你的函数可以是这个样子

def f(mat, v): 
    row_sums = [sum(abs(x) for x in row if x >= v) for row in mat] 
    return sum(row_sums) 

从你的问题,这不是很清楚,我不管你想

  • 比较abs(x)vxv
  • 总结abs(x)x

但是你应该可以调整上面的代码来满足你的需要。

还有一个python模块,可以帮助你扁平清单列表。该功能被称为chain.from_iterable。所以上面的代码也可以这样写:

from itertools import chain 

def f(mat, v): 
    sums = [sum(abs(x) for x in chain.from_iterable(mat) if x >= v] 
    return sum(sums)