2017-09-02 76 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)