Jeb
Jeb

Reputation: 111

Format for arrays in Python

This is a soft question about working with arrays in Python. I recently solved Q11 from Project Euler and wondering if there is a function for implementing some string I copy and pasted. I've seen people edit the string (since it's not that large) to get to an workable array faster, but I'm wondering if there is something buried in the documentation? Here's an example situation where I'd like to improve:

Inputstring = """08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 """

Listdata = Inputstring.split(' ') 
Matrixdata = {}  

for i in range(0,20):
    for j in range (0,20):
         Matrixdata[i,j] = int(Listdata[ (20 * i) + j])

i.e. I took the raw data and indexed it into Matrixdata[i,j]. Is there a way get to Matrixdata[i,j] with some function or something?

Upvotes: 0

Views: 660

Answers (2)

tobias_k
tobias_k

Reputation: 82889

You can use a nested list comprehension, combining splitlines, split, and int.

>>> [[int(x) for x in line.split()] for line in Inputstring.splitlines()]
[[8, 2, 22, ..., 91, 8], [49, 49, ..., 0], ..., [1, 70, ..., 67, 48]]

Note that this will create a list of lists, not a dictioanry of tuples, i.e. to access the value at position x, y, you have to do matrix[x][y], not matrix[x,y]

If you prefer a dictionary of tuples, you can use this somewhat more complicated dictionary comprehension:

>>> {(i,k): int(x) for i, line in enumerate(Inputstring.splitlines()) for k, x in enumerate(line.split())}
{(7, 3): 68, (16, 9): 94, (19, 4): 83, ..., (13, 1): 80, (11, 17): 29, (2, 0): 81}

Upvotes: 5

chucksmash
chucksmash

Reputation: 5997

There are a couple of issues going on here. Matrixdata = {} creates a dict which is not the same as a list of lists. Your variable naming is also not Pythonic. For variables, prefer words_with_underscores; for classes, prefer CamelCaseWithInitialCaps.

input_str = """08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 """

matrix_data = []    

for line in input_str.splitlines():
    matrix_data.append([int(num) for num in line.split()])

You'd then access the data in say the 7th column, 5th row via:

matrix_data[4][6]

Because lists are zero-indexed.

Upvotes: 1

Related Questions