0

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?

4
  • I guess I'm asking if this is how I should be implementing arrays in python. Commented Sep 1, 2015 at 16:44
  • 2
    I don't understand what you're asking. But in any case, you should use Inputstring.split() and not Inputstring.split(' ') because the input string contains newlines as well as spaces. Commented Sep 1, 2015 at 16:44
  • also add Listdata = Inputstring.replace('\n', '').split(' ') because you have a bunch of random newlines in there Commented Sep 1, 2015 at 16:50
  • But you are asking questions about copy and paste as well. Help us to help you by making it more clear what you are asking. If you are asking something akin to "How do you like to implement arrays" that is too broad. Commented Sep 1, 2015 at 16:50

2 Answers 2

5

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}
Sign up to request clarification or add additional context in comments.

Comments

1

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.

Comments

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.