How do I create a list of floats in Python?

52915
6
10-06-2017 07:33 AM
AndrewMartin8
New Contributor III

I am having an issue of creating an array of floats. I have a loop that is scanning the rows of an attribute table and extracting numbers from it. SARAarea, truearea and rasterarea are all extracted from an attribute table and they should be floats. I am trying to use these numbers and do calculations with them and then insert them back into the attribute table. My main issue is adding floats to the list. I keep getting error messages that a float is not iterable or a float is not an attribute to append or extend. What is the best way to do this? I tried to create one loop that would getvalue and insert value into the attribute without using a list. But the searchcursor function only allows me to create two separate loops because there is a seachCursor and a UpdateCursor, it only allows me to do one task at a time.

This is my attempt at initializing the lists

approxTen=['f']
approxremaining=['f']
lessperc=['f']
moreperc=['f']‍‍‍‍

This is where I am getting my errors. The code is in a while loop of a searchCursor. "While row:".

  approxTen=(SARAarea*truearea)/rasterarea
  approxremaining=truearea-approxTen
  
  lessperc=(approxTen/truearea)*100
  moreperc=(approxremaining/truearea)*100
  
  approxTen.append(approxTen)
  approxremaining.append(approxremaining)
  
  lessperc.append(lessperc)
  moreperc.append(moreperc)‍‍‍‍‍‍‍‍‍‍‍

Common error I am getting below. Line 50 is line 7 in the code above. I have tried extend and append but neither worked and I haved tried putting float() around the values of approxTen and the rest of them but it did not work.

For example:  approxremaining= float(truearea-approxTen)

This is how I am inserting it back into the attribute table. Below is a separate loop then above code. I am trying to loop through the list and add it to the attribute table.

while row3: 
  row3[0]=approxTen[row3]
  row3[1]=approxremaining[row3]
  row3[2]=lessperc[row3]
  row3[3]=moreperc[row3]
  cursoru.updateRow(row3)‍‍‍‍‍‍
0 Kudos
6 Replies
DanPatterson_Retired
MVP Esteemed Contributor

This....

approxTen=(SARAarea*truearea)/rasterarea

isn't a list

This...

approxTen = [(SARAarea * truearea) / float(rasterarea)]

is a list to which you can append or extend to (notice the [ ] ) and there is a small added floating point check to ensure that you don't perform unwanted integer division. This also assumes that rasterarea is not 0 (otherwise add value checks for that condition.

JoshuaBixby
MVP Esteemed Contributor

The line:

approxTen=(SARAarea*truearea)/rasterarea

is assigning approxTen to a float, or possibly an int depending on the types of variables in the equation.  Since approxTen is a float, you can't append something to it because floats don't have append or extend methods.  Going further back in your code, your code to initialize a list of floats is not doing what you think:

approxTen=['f']

The code as written is creating a list with a single item, the item being a string with a single character, 'f'.  You can initialize a float array, but the syntax is different:

>>> import array
>>> approxTen = array.array('f')
>>> approxTen
array('f')
>>> 

Lists are more common in Python than arrays because of their flexibility with data types and syntactic sugar for working with them, like list comprehensions.  There is a case to be made for working with arrays but that is usually when performance is a primary concern.

AndrewMartin8
New Contributor III

I switched it to an array and it works very well. But I am having an issue inputting values on the attribute table. My code is receiving no errors but I believe it is only inputting the values at the end of the array.

I have it looping 4 times but it is only filling in one row of the table. What is the main issue going on?

0 Kudos
JoshuaBixby
MVP Esteemed Contributor

You will need to post more code, not necessarily all, but more of the functional parts.  With the snippets you have posted here, it is hard to provide specific suggestions.  The structure of your code snippet, i.e., the way you are using a while loop, is not very idiomatic.  As best I can tell, even though you may be looping over row3, you are not moving the cursor, so you appear to be continually updating the same row.

DanPatterson_Retired
MVP Esteemed Contributor

You updated one row... examine updatecursors and examine the code snippet in the help files to get the proper syntax

curtvprice
MVP Esteemed Contributor

Though, Dan, I would recommend using the newer arcpy.da.UpdateCursor as its performance is 10-100x faster.

UpdateCursor—Help | ArcGIS Desktop 

0 Kudos