Reputation: 447
in my python code I search for a specific format which then returns floats ie
...
return {'ID': int(dataINgood[0]),
'mIdx': int(dataINgood[2])-1,
'Px' : float(dataINgood[6]),
'Py' : float(dataINgood[7]),
'Pz' : float(dataINgood[8]),
'E' : float(dataINgood[9]),
'M' : float(dataINgood[10])}
What I want is to do something line
'Pt' : math.sqrt(float( dataINgood[6] * dataINgood[6]) + float(dataINgood[7]*dataINgood[7]))
but this returns
'Pt' : math.sqrt(float( dataINgood[6] * dataINgood[6]) + float(dataINgood[7]*dataINgood[7])) }
TypeError: can't multiply sequence by non-int of type 'str'
Any hint ?
thanks
Upvotes: 0
Views: 1641
Reputation: 392
math.sqrt(float( dataINgood[6] * dataINgood[6]) + float(dataINgood[7]*dataINgood[7]))
you need to convert dataINgood[x] to float before multiplication so you should try below syntax
**math.sqrt((float(dataINgood[6]) * float(dataINgood[6])) + (float(dataINgood[7])* float(dataINgood[7])))**
Upvotes: 0
Reputation: 21585
Cast everything, then work:
fs = [float(x) for x in dataINgood]
{... 'Pt' : math.sqrt(fs[6]**2 + fs[7]**2) }
BTW, this is better:
{... 'Pt' : math.hypot(fs[6], fs[7]) }
So your code looks like this:
fs = [float(x) for x in dataINgood]
return {'ID': int(fs[0]),
'mIdx': int(fs[2])-1,
'Px' : fs[6],
'Py' : fs[7],
'Pz' : fs[8],
'E' : fs[9],
'M' : fs[10],
'Pt' : math.hypot(fs[6], fs[7])
}
Upvotes: 1
Reputation: 32923
Because dataINgood
is a list
of strings
. You need to convert the values to float
:
'Pt' : math.sqrt(float( dataINgood[6] ) * float( dataINgood[6]) +
float(dataINgood[7]) * float(dataINgood[7]))
Upvotes: 1