[Tutor] Building Starships -- object of type 'int' has no len()
Terry--gmail
terry.kemmerer at gmail.com
Fri Aug 15 19:46:49 CEST 2014
Python 3.3
This has something to do with the nature of FOR statements and IF
statements, and I am sure it must be a simple mistake...but I seem to be
stumped.
I am writing a starship encounter program as my first real python
program....where the user gets a random amount of credits to design his
own ship and the computer also gets a random number of credits to spend
and designs it's own ship, and then they go into combat against each other.
This is part of the design phase for the user. The user has picked one
category of the catalog, such as:
Hulls, Drives, Shields, Weapons, Personnel, etc
catalog and catalog2 are lists of lists: [[],[],[]]
OK. So, my program has scanned the master catalog for a particular
chosen category and has built catalog2 containing all the parts of that
one category and their associated differences (rows), and now I want to
print it out as a menu for the user to pick what part to add of this
particular category to his ship.
But first, so that I can pretty print the menu items and their
associated capabilities to the screen in nice uniform columns, I need to
know the maximum size of what is going to be printed in each column on
the screen in advance, so I do the below learning scan through catagory2
and I build the simple list 'lens' to contain the max size of each column.
As I run the program, this works perfectly for every NEW category the
user picks, and the rows of associated data are printed just like I
want.......*UNTIL the user chooses to buy a second part from a category
he has already visited*, and at that point things error out. Below is
the problem code and the error:
lens = []
# pre-format the list called lens for maximum number of columns
contained in catalog2
lens = [0] * len(catalog2[0])
# map the largest sizes of each column into list 'lens'
col, line_number = 0, 0
for line_number in range(len(catalog2)):
for col in range(len(catalog2[line_number])):
*if lens[col] < len(catalog2[line_number][col]):*
lens[col] = len(catalog2[line_number][col])
Traceback (most recent call last):
File "encounter.py", line 379, in <module>
myship = designShip(credits, myship)
File "encounter.py", line 354, in designShip
hull, myship, credits, section = nicePrint(hull, credits, myship,
catalog, section)
File "encounter.py", line 199, in nicePrint
if lens[col] < len(catalog2[line_number][col]):
TypeError: *object of type 'int' has no len()*
I don't get it. This code does the same job, again and again
successfully as I proceed to pick new categories. Why would it care if I
want to go over the same ground more than once??? It seems to me that
the FOR STATEMENT automatically zeros the counters 'col' and
line_number' when it starts counting, but why would it suddenly choke
because of going over old territory???
In trying to debug i have checked catalog2 and it's data is present and
intact. I added the line 'col, line_number = 0, 0' in the sequence of
events although I don't see why it would be needed, and evidently it
isn't needed because the problem persists. What's left to check?
I really want to buy more guns and bombs and armor! But the program
seems to be on the side of gun control!!!
:)
Thanks for your thoughts and suggestions!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20140815/a60bbd2b/attachment.html>
More information about the Tutor
mailing list