Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 9, 2009 21:17:32

serega_sh
От:
Зарегистрирован: 2009-03-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ламерский вопрос про двухмерных массив и чтение из файла.

Здравствуйте, у меня ламерский вопрос. Помогите, пожалуйста.
Есть файл:
24 28
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 4
…..
…..
и так 24 столбца и 28 строк.
Первая строка - размер двухмерного массива.

Разделители чисел - табуляторы.

Задача - считать файл в двумерный массив с числами.
С чтением худо-бедно разобрался. Скажите, это ламерский способ или нет:

data = [[]]

def read_data_from_file():
f = open('data.txt', 'r')
linesFromFile = f.readlines()

counter = 0
for line in linesFromFile:
digit = ""
for symbol in line:
if symbol.isdigit():
digit = digit + symbol
else:
if digit.isdigit():
print "digit:" + digit
digit = ""
counter = counter + 1 #counter for row array index...

#start execution
read_data_from_file()
Я как бы объявил глобальный двухмерный массив data [], но не понимаю, как в него писать считываемые числа ( digit.isdigit() )

Если я вытаскиваю циферки из файла как ламер, дайте ссылку на хороший пример.
Скажите, как записывать собранные числа массив.

Спасибо



Офлайн

#2 Апрель 9, 2009 21:36:18

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Ламерский вопрос про двухмерных массив и чтение из файла.

open(r'<путь_до_фаила>').readlines()[0] #выбиваем первую строку
open(r'<путь_до_фаила>').readlines()[1] #выбиваем вторую строку

open(r'<путь_до_фаила>').readlines()[0].split("\t")[0] #первый символ из первой строки
кажется так…

Отредактировано (Апрель 9, 2009 21:37:07)

Офлайн

#3 Апрель 9, 2009 21:48:09

serega_sh
От:
Зарегистрирован: 2009-03-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ламерский вопрос про двухмерных массив и чтение из файла.

Сделал такую штуку:

1. Убрал размер матрицы, она прямоугольная.
2. Почему-то первая строка в двухмерном массив - пустая. Не пойму, почему:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 4
1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 1
1 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 1
И так еще 24 строки
data = [[]]

def read_data_from_file():
f = open('data.txt', 'r')
linesFromFile = f.readlines()
row = 0
column = 0
for line in linesFromFile:
row = row + 1
temp = []
digit = ""
for symbol in line:
if symbol.isdigit():
digit = digit + symbol
else:
if digit.isdigit():
temp.append(int(digit))
column = column + 1
digit = ""
if len(temp) > 0:
data.append(temp)
print "row -> " + str(temp) + "<-"
print "all rows = " +str(row)
print "all columns = " + str(column/row)
#start execution
read_data_from_file()
print "test (expected 4) = " + str(data[1][23])
Результат:
row -> <-
row -> <-
И так еще 26 строк

all rows = 28
all columns = 24
test (expected 4) = 1
Несмотря на то, что первая пустая строка в выводе не отображается, она есть.
Написав в тесте
print "test (expected 4)  = " + str(data[2][23])
Я получу вожделенную 4
WTF, не пойму, откуда берется пустая строка, может, это из-за того, что я data криво объявил?

Что делать?



Отредактировано (Апрель 9, 2009 21:49:37)

Офлайн

#4 Апрель 9, 2009 22:10:44

serega_sh
От:
Зарегистрирован: 2009-03-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ламерский вопрос про двухмерных массив и чтение из файла.

Надо так объявлять:

data = []
Тогда никаких пустых списков не будет. И эта строчка - лишняя:
if len(temp) > 0:
Поговорив с умным человеком, разобрался.



Отредактировано (Апрель 9, 2009 22:11:24)

Офлайн

#5 Апрель 9, 2009 22:27:44

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Ламерский вопрос про двухмерных массив и чтение из файла.

def read(f):
out = []
for line in f:
row = [int(i) for i in line.split()]
out.append(row)
return out

print read(open('input_file.txt'))



Офлайн

#6 Апрель 9, 2009 22:42:21

serega_sh
От:
Зарегистрирован: 2009-03-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ламерский вопрос про двухмерных массив и чтение из файла.

Андрей Светлов
def read(f):
out = []
for line in f:
row = [int(i) for i in line.split()]
out.append(row)
return out

print read(open('input_file.txt'))
Жесть, какой я лол. Спасибо большое!



Офлайн

#7 Апрель 9, 2009 23:57:37

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Ламерский вопрос про двухмерных массив и чтение из файла.

Не робей. Когда я начинал возиться с питоном - примерно так же тупил. К счастью, быстро прошло.



Офлайн

#8 Апрель 10, 2009 01:48:03

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Ламерский вопрос про двухмерных массив и чтение из файла.

Кстати, более короткий вариант:

[[int(i) for i in line.split()] for line in open('input_file.txt')]
Можно еще по разному. Но первый - оптимальней для начала.



Офлайн

#9 Апрель 10, 2009 10:13:12

serega_sh
От:
Зарегистрирован: 2009-03-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Ламерский вопрос про двухмерных массив и чтение из файла.

Андрей Светлов
Кстати, более короткий вариант:
[[int(i) for i in line.split()] for line in open('input_file.txt')]
Можно еще по разному. Но первый - оптимальней для начала.
Это все тяжелое наследние Java. Спасибо большое!
Когда изучаешь язык, важно с самого начала понять его идеологию. А то начнешь писать неправильно, а переучиться потом будет очень сложно.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version