2

I must be missing something, but I have trouble with finding out the biggest values and printing them using the csv.DictReader() function.

The csv file is something like (I have cut the fields as well as rows because the rows are too wide for this format):

traverse;damage;hull_front;turret_back;penetration;full_name;tier;hull_back;turret_sides;type;hull_sides;turret_front
38;30;18;16;32;Light Tank MS-1;1;16;16;Light Tank;16;18
40;30;13;13;32;Light Tank BT-2;2;13;13;Light Tank;13;15
55;36;15;15;34;Light Tank T-26;2;15;15;Light Tank;15;15

(Hope I got all the fields, I had to use cut with the original file.)

I read this file with

tanks = csv.DictReader(open('tanks.csv', 'r'), delimiter = ';')

but when I try to found out e.g. which row has the biggest value in which column, I seem unable to read through the dictionary. My attempt looks like this:

def top_values(tanks):
  tank = list(itertools.islice(tanks,1,2))

  best_tanks = dict({'turret_front':tank, 'turret_sides':tank, 'turret_back':tank, 
                   'hull_front':tank, 'hull_sides':tank, 'hull_back':tank,
                   'penetration':tank, 'damage':tank, 'traverse':tank})

  fields = ['turret_front', 'turret_sides', 'turret_back', 
          'hull_front', 'hull_sides', 'hull_back',
          'penetration', 'damage', 'traverse']

  for tank in tanks:
      for field in fields:
        if tank[field] > best_tanks[field][field]:
            best_tanks[field] = tank

  print "Best tanks by values:\n"
  for field in fields:
    tank = best_tanks[field] 
    print field + ": " + tank['full_name'] + "(" + tank[field] + ")" 

But I get

Traceback (most recent call last):
File "./wotalyzer.py", line 102, in <module>
main(sys.argv[1:])
File "./wotalyzer.py", line 98, in main
top_values(tanks)
File "./wotalyzer.py", line 44, in top_values
print field + ": " + tank['full_name'] + "(" + tank[field] + ")" 
TypeError: list indices must be integers, not str

How can I accomplish this? I want to do it like this to make it easy to add new fields.

1 Answer 1

2

In tank = list(itertools.islice(tanks,1,2)) you define tank as a list.

best_tanks is a dict with the values being the list tank.

In your if you replace the lists in best_tanks with the variable tank that now is a dict, so its ok to later use best_tanks[field][field].

But if the if if is not executed, the element in best_tanks will still have a list, resulting in best_tanks[field] being a list, which will result in the error TypeError: list indices must be integers, not str when you try to access the element with the string field

Sign up to request clarification or add additional context in comments.

1 Comment

Yep, I did this and it works after I fixed an other bug (which caused an empty dict to be given to the function).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.