Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 8, 2010 14:35:33

lyncs
От:
Зарегистрирован: 2010-09-08
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Заполнение двумерного массива

f1.readlines() представляет собой список из строк, по три слова в каждой
мне нужно получить двумерный массив, каждым элементом которого является слово

sp1 = f1.readlines()
sp2 = range(n)
for i in range(n):
sp2[i] = range(3)

for i in range(n):
sp2 = sp1[i].split()
for j in range(3):
sp1[i][j] = sp2[j]#ошибка 'str' object does not support item assignment

for i in range(n): #вывод массива на экран
for j in range(3):
print sp1[i][j],
print
подскажите, пожалуйста, как исправить ошибку



Офлайн

#2 Сен. 8, 2010 14:54:32

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Заполнение двумерного массива

мда…

sp = []
for stroka in f1.readlines():
sp.append(stroka.split())
print sp



Отредактировано (Сен. 8, 2010 14:59:15)

Офлайн

#3 Сен. 8, 2010 15:25:12

lyncs
От:
Зарегистрирован: 2010-09-08
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Заполнение двумерного массива

спасибо огромное))) видимо, мне ещё многому учиться нужно

но у меня возникла ещё одна трудность
в некоторых строках не по три слова, а по два
естественно при обращении к этому элементу по индексу возникает ошибка
если ли способ сделать так, чтобы при преобразовании строк с двумя словами в массив
образовывался бы массив не из двух элементов, а из трёх последний из которых пуст



Офлайн

#4 Сен. 8, 2010 15:41:18

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

Заполнение двумерного массива

можно так:

for line in f.readlines():
if len(line.split())!=3:
sp.append(line.split().append(""))
else:
sp.append(line.split())
print sp



Офлайн

#5 Сен. 9, 2010 09:05:22

lyncs
От:
Зарегистрирован: 2010-09-08
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Заполнение двумерного массива

спасибо)
только так как вы написали, не добавлялся ещё один элемент в строку из двух слов, а появлялось None между строками

вот так всё работает отлично:

sp = []
k = []
for stroka in f1.readlines():
if(len(stroka.split())!=3):
k = stroka.split()
k.append("")
sp.append(k)
else:
sp.append(stroka.split())
print sp



Офлайн

#6 Сен. 9, 2010 09:20:24

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Заполнение двумерного массива

А зачем split два раза вызывать? может так проще:

sp = []
for stroka in f1.readlines():
sp.append(stroka.split())
while 3 > len(sp[-1]): # на случай, если попадется строка с одним словом :)
sp[-1].append("")
print sp



Офлайн

#7 Сен. 9, 2010 09:31:25

lyncs
От:
Зарегистрирован: 2010-09-08
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Заполнение двумерного массива

о.. классно) спасибо)))



Офлайн

#8 Сен. 9, 2010 18:50:32

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Заполнение двумерного массива

Без цикла

sp = []
for stroka in f1.readlines():
lst = stroka.split()
sp.append(lst + ['']*(3-len(lst) ) )
print sp



Офлайн

#9 Сен. 9, 2010 18:57:55

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Заполнение двумерного массива

Или в одну строчку:

print [item + ['']*(3-len(item)) for item in (stroka.split() for stroka in f1.readlines()) ]



Офлайн

#10 Сен. 9, 2010 19:26:30

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Заполнение двумерного массива

Кстати, функция f1.readlines() читает весь файл в память. Чтобы этого не было, надо вместо

for stroka in f1.readlines()
писать

for stroka in f1
так как f1 сам является итератором строк.
То есть конечный вариант:

print [ item + ['']*(3-len(item)) for item in (line.split() for line in f1) ]



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version