How to convert 2D list of string into 2D list of integers in Python

Question:

I have written the following code to read a csv file into a multidimensional list which is working fine. The problem arise when I created a function to calculate the total of 2D list. This is happening because the numbers are in string inside the 2D list i.e.

[[‘0’, ‘0’, ’30’, ‘2’, ’21’, ’13’, ’23’], …..,[‘8′, ’25’, ‘1’, ‘6’, ’21’, ’23’, ‘0’]].

What would be the simplest way to convert the string elements into integers in a 2D list such as

[[0, 0, 30, 2, 21, 13, 23],…..,[8, 25, 1, 6, 21, 23, 0]]

My code so far

rows = 52
cols = 7

def populate2D():

  with open("rainfall.csv","r") as file:
    lineArray = file.read().splitlines()
    matrix = []
    for line in lineArray:
      matrix.append(line.split(","))

  return matrix

def display(matrix):

  print(matrix)
  
def yearly(matrix):

    total = 0
    for row in matrix:
      for value in row:
        total += value
    return total

matrix = populate2D()
display(matrix)
total = yearly(matrix)
print()
print("Total rainfall for the year is " + str(total))

csv file

0,0,30,2,21,13,23
29,3,29,30,7,8,25
26,5,26,13,4,13,4
22,30,13,15,15,0,2
3,12,11,10,17,0,15
8,13,11,24,30,24,27
22,18,2,29,11,13,18
15,1,29,23,18,7,0
23,27,3,7,13,14,28
6,25,24,14,20,23,5
24,29,26,22,0,9,18
22,27,22,20,24,29,21
23,13,14,4,13,1,21
25,21,21,6,28,17,19
4,6,11,10,21,1,5
11,7,22,11,10,24,15
25,11,23,3,23,8,3
22,23,0,29,15,12,5
21,11,18,22,1,4,3
11,10,3,1,30,14,22
2,16,10,2,12,9,9
2,29,17,16,13,18,7
22,15,27,19,6,26,11
21,7,18,4,14,14,2
6,30,12,4,26,22,11
21,16,14,11,28,20,3
19,10,22,18,30,9,27
8,15,17,4,11,16,6
19,17,16,6,18,18,6
2,15,3,25,27,16,11
15,5,26,24,24,30,5
15,11,16,22,14,23,28
25,6,7,20,26,18,16
5,5,21,22,24,16,5
6,27,11,8,24,1,16
28,4,1,4,3,19,24
19,3,27,14,12,24,0
6,3,26,15,15,22,26
18,5,0,14,15,7,26
10,5,12,22,8,7,11
11,1,18,29,6,9,26
3,23,2,21,29,15,25
5,7,1,6,15,18,24
28,11,0,6,28,11,26
4,28,9,24,11,13,2
6,2,14,18,20,21,1
20,29,22,21,11,14,20
28,23,14,17,25,3,18
6,27,6,20,19,5,24
25,3,27,22,7,12,21
12,22,8,7,0,11,8
8,25,1,6,21,23,0

output

$ python rainfall.py
[['0', '0', '30', '2', '21', '13', '23'], ['29', '3', '29', '30', '7', '8', '25'], ['26', '5', '26', '13', '4', '13', '4'], ['22', '30', '13', '15', '15', '0', '2'], ['3', '12', '11', '10', '17', '0', '15'], ['8', '13', '11', '24', '30', '24', '27'], ['22', '18', '2', '29', '11', '13', '18'], ['15', '1', '29', '23', '18', '7', '0'], ['23', '27', '3', '7', '13', '14', '28'], ['6', '25', '24', '14', '20', '23', '5'], ['24', '29', '26', '22', '0', '9', '18'], ['22', '27', '22', '20', '24', '29', '21'], ['23', '13', '14', '4', '13', '1', '21'], ['25', '21', '21', '6', '28', '17', '19'], ['4', '6', '11', '10', '21', '1', '5'], ['11', '7', '22', '11', '10', '24', '15'], ['25', '11', '23', '3', '23', '8', '3'], ['22', '23', '0', '29', '15', '12', '5'], ['21', '11', '18', '22', '1', '4', '3'], ['11', '10', '3', '1', '30', '14', '22'], ['2', '16', '10', '2', '12', '9', '9'], ['2', '29', '17', '16', '13', '18', '7'], ['22', '15', '27', '19', '6', '26', '11'], ['21', '7', '18', '4', '14', '14', '2'], ['6', '30', '12', '4', '26', '22', '11'], ['21', '16', '14', '11', '28', '20', '3'], ['19', '10', '22', '18', '30', '9', '27'], ['8', '15', '17', '4', '11', '16', '6'], ['19', '17', '16', '6', '18', '18', '6'], ['2', '15', '3', '25', '27', '16', '11'], ['15', '5', '26', '24', '24', '30', '5'], ['15', '11', '16', '22', '14', '23', '28'], ['25', '6', '7', '20', '26', '18', '16'], ['5', '5', '21', '22', '24', '16', '5'], ['6', '27', '11', '8', '24', '1', '16'], ['28', '4', '1', '4', '3', '19', '24'], ['19', '3', '27', '14', '12', '24', '0'], ['6', '3', '26', '15', '15', '22', '26'], ['18', '5', '0', '14', '15', '7', '26'], ['10', '5', '12', '22', '8', '7', '11'], ['11', '1', '18', '29', '6', '9', '26'], ['3', '23', '2', '21', '29', '15', '25'], ['5', '7', '1', '6', '15', '18', '24'], ['28', '11', '0', '6', '28', '11', '26'], ['4', '28', '9', '24', '11', '13', '2'], ['6', '2', '14', '18', '20', '21', '1'], ['20', '29', '22', '21', '11', '14', '20'], ['28', '23', '14', '17', '25', '3', '18'], ['6', '27', 
'6', '20', '19', '5', '24'], ['25', '3', '27', '22', '7', '12', '21'], ['12', '22', '8', '7', '0', '11', '8'], ['8', '25', '1', '6', '21', '23', '0']]
Traceback (most recent call last):
  File "C:rainfall.py", line 33, in <module>
    total = yearly(matrix)
  File "C:rainfall.py", line 28, in yearly
    total += value
TypeError: unsupported operand type(s) for +=: 'int' and 'str'
Asked By: Mateo

||

Answers:

You have to convert the array of numbers from string to int using map function when reading the numbers from the CSV

Replace

for line in lineArray:
  matrix.append(line.split(","))

with

for line in lineArray:
  matrix.append(list(map(int, line.split(","))))
Answered By: pavi2410

The TypeError tells that you try to add an str and not an int to an int. You can convert your str to an int by just wrapping int(<YourString>) arrount it.

So in your code it would like this:

total = 0
for row in matrix:
  for value in row:
    total += int(value) # this line
return total

Also when you read from a file the data is stored in str and not int.

Answered By: Raboro
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.