PDA

View Full Version : list of data filled into 2d array Python



xsinsx
May 30th, 2010, 10:28 PM
If I wanted a list of data fed into an 2d array and the first dimension be based on the lines in the txt file such as line 1 of data would be at a[0][whatever the index of data in line one is.]. and the second dimension be based on the data in the line based on its column value.

Here is an example of something I would want to input into the array from a separate file.

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

so based on this example text the [0][0] index would be 08. and the [0][1] index would be 02.
so essentially every time it reads a newline i would need it to start the next row of the array.

I know to read a file i need.

open('textfile.txt', 'r')

but how would i go about inputting these into the proper index in the 2d array.
I would appreciate any advice or maybe a better method for something like this.

xsinsx
May 31st, 2010, 12:34 AM
Update: Ok, so I have been working on the problem and I have gotten this far


#!/usr/bin/python
x = open('p11nums.txt', 'r').read()
a = []
y = "".join(x.split(" "))
for k in range(0, 19):
a.append([])
for i in range(0, 19):
b = y[i:i+2]
a[i].append(b)
print a

when i run i get the falling error:



Traceback (most recent call last):
File "p11.py", line 9, in <module>
a[i].append(b)
IndexError: list index out of range


im confused how im calling it out of index when it reaches 20 when doing this for an array of 20x20 array.




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

this is the list of data im trying to input into the array.

bunburya
May 31st, 2010, 12:45 AM
range(0, 19) = numbers from 0 to 18. If you want 20 numbers, ie 0 to 19 inclusive, use range(0, 20) or just range(20).

xsinsx
May 31st, 2010, 12:51 AM
well I see that mistake but even after fixing my ranges im still getting a list index out of range.


Traceback (most recent call last):
File "p11.py", line 9, in <module>
a[i].append(b)
IndexError: list index out of range

simeon87
May 31st, 2010, 12:55 AM
That's because a does not have enough elements when the inner loop runs. Let's say the outer loop starts, so k = 0. Then you append [] to a. So a has one element. Then you're walking from 0 to 19 with i and you're requesting element i from a. But a only has one element. So only a[0] will succeed, the others will give an error.

xsinsx
May 31st, 2010, 01:13 AM
why thank you i see my mistake there ok. I am getting somewhere now.

StephenF
May 31st, 2010, 02:25 AM
with open("textfile.txt") as f:
d = [d.split() for d in f]

trent.josephsen
May 31st, 2010, 03:16 AM
with open("textfile.txt") as file:
array = [line.split() for line in file]

(with new variable names for clarity)

That is probably the most Pythonic way to do it. The work has been done for you in this case.