ahhtwer
ahhtwer

Reputation: 307

Forcing a variable to be an integer

errors = int(0)
for i in range(len(expectedData)):
    if data[i] != expectedData[i]:
        errors += int(binary_compare(data[i], expectedData[i]))
return errors

I have the above code which I am trying to use to calculate some integer (number of errors) for some data. I have casted everything I can see possible as an integer, yet the line "errors += ..." still appends the value, rather than adds it.

For example, if my answer should be 7, I might get 500002. (5 + 0 + 0 + .. + 2). I have never run into this before. The function binary_compare is returning an integer as well, but I'm completely in the dark as to why this isn't working.

Upvotes: 1

Views: 15075

Answers (2)

kennytm
kennytm

Reputation: 523464

I think the error is outside of your code, but anyway, in Python, list operations are seldom done with loops, as this focuses on the implementation rather on the purpose. List comprehension, generators etc are preferred, and there are also many built-in and standard library functions for common tasks.

In your case, I would write the function as

return sum(binary_compare(x, y) for x, y in zip(data, expectedData) if x != y)

If you are using Python 2.x, itertools.izip should be used instead of zip.

Upvotes: 2

mykhal
mykhal

Reputation: 19924

python is not javascript

it's no way to get concatenated strings instead of math sum, when you do count += value starting with count = 0. if you try to add a string to integer, exception is raised:

>>> x = 0
>>> x += "1"
TypeError: unsupported operand type(s) for +=: 'int' and 'str'

to compare values of which you don't know whether they are strings or integers, i'd use

str(data[i]).strip() == str(expectedData[i]).strip()

for noninteger-proof math sum, you might want to do something like this

try:
    value = int(expectedData[i])
except:
    value = 0
count += value

Upvotes: 4

Related Questions