Уведомления

Группа в Telegram: присоединиться

#1 Янв. 13, 2019 17:16:41

IfDANCodeR
Зарегистрирован: 2019-01-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Как создать список с изначально неизвестным количеством элементов

Есть такой код:

 def textcutter(winyorwinxortextar, text, winxdefault):
    textsplit = text.split()
    winytext = 1
    curtextsplit = []
    if(len(textsplit) == 1):
        winxtext = len(text)
    else:
        for n in range(len(textsplit)):
                curtextsplit[winytext] = textsplit[n]
                if(len(currenttextsplit[winytext]) >= winxdefault):
                    curtextsplit[winytext] = oldcurtextsplit
                    winytext += 1
                elif(n < len(textsplit)):
                    oldcurtextsplit = curtextsplit[winytext]
                    curtextsplit[winytext] += ' '
    print(winytext)
text = "Какой-то криповый сегодня вечерок, не правда ли, друзья?"
textcutter(1, text, 20)

В теории, он должен разделять текст на строки, чтобы они по длине не превышали winxdefault (в крайнем случае, winxdefault будет увеличиваться (но с этим я разберусь)) и возвращать несколько значений, в зависимости от заданных параметров (с этим я разберусь)
Проблема в том, что python выдает мне ошибки по диапазону индексов (он больше возможного):

 Traceback (most recent call last):
  File "C:\Users\danil\Desktop\Python\test.py", line 18, in <module>
    textcutter(1, text, 20)
  File "C:\Users\danil\Desktop\Python\test.py", line 9, in textcutter
    curtextsplit[winytext] = textsplit[n]
IndexError: list assignment index out of range 

Как избавиться от этой ошибки?

Отредактировано IfDANCodeR (Янв. 14, 2019 16:32:05)

Офлайн

#2 Янв. 13, 2019 17:42:53

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 507
Репутация: +  55  -
Профиль   Отправить e-mail  

Как создать список с изначально неизвестным количеством элементов

IfDANCodeR для начала
вставляете свой код в окно сообщений затем выделяете его от начала и до конца удерживая л.к.м. и после выделения когда ваш код уже выделен синим идете вверх окна рядом с смайликом слева наводите на стрелку а затем жмете PYTHON и ваш код будет полным и читаемым. а так не читаемый код

Офлайн

#3 Янв. 14, 2019 13:14:16

IfDANCodeR
Зарегистрирован: 2019-01-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Как создать список с изначально неизвестным количеством элементов

marvellik
IfDANCodeR для начала вставляете свой код в окно сообщений затем выделяете его от начала и до конца удерживая л.к.м. и после выделения когда ваш код уже выделен синим идете вверх окна рядом с смайликом слева наводите на стрелку а затем жмете PYTHON и ваш код будет полным и читаемым. а так не читаемый код
Исправил

Офлайн

#4 Янв. 14, 2019 13:33:59

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 1347
Репутация: +  200  -
Профиль   Отправить e-mail  

Как создать список с изначально неизвестным количеством элементов

все правильно оно говорит:

 winytext = 1
curtextsplit = []
...
   curtextsplit[winytext] = textsplit[n]
У вас curtextsplit пустой список, там нету ни одного элемента, а вы пытаетесь изменить его первый!!!(тоесть по факту второй) элемент.

IfDANCodeR
В теории, он должен разделять текст на строки, чтобы они по длине не превышали winxdefault
на практике он делает что угодно но только не это.

Отредактировано PEHDOM (Янв. 14, 2019 14:06:15)

Офлайн

#5 Янв. 14, 2019 14:13:44

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 136
Репутация: +  15  -
Профиль   Отправить e-mail  

Как создать список с изначально неизвестным количеством элементов

Для добавления в конец списка имеется хорошая функция append

 curtextsplit.append(textsplit[n])
Насколько я понимаю, в список curtextsplit будет идти добавление последовательно: первая строка идёт первым элементом, вторая - следующий и т.д.

Офлайн

#6 Янв. 14, 2019 14:55:10

IfDANCodeR
Зарегистрирован: 2019-01-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Как создать список с изначально неизвестным количеством элементов

Rafik
Для добавления в конец списка имеется хорошая функция append
Окей
Но дело-то в том, что таким образом из curtextsplit получится тот же список из слов, что и textsplit
А мне нужно, чтобы цикл проходил через if, менялось winytext, выставлялись пробелы, и только когда winytext меняется на следующее значение (когда набирается количество знаков, меньше, чем winxdefault, но при этом следующее слово добавляет количество символов, не влазящее в winxdefault (это последнее слово и не вписывается)), следовательно, уже тогда менялся индекс curtextsplit
Так вот, как добавлять в конец строки элементы (в строку с нужным индексом)?

Отредактировано IfDANCodeR (Янв. 14, 2019 15:21:30)

Офлайн

#7 Янв. 14, 2019 16:31:28

IfDANCodeR
Зарегистрирован: 2019-01-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Как создать список с изначально неизвестным количеством элементов

Rafik
Для добавления в конец списка имеется хорошая функция append
PEHDOM
все правильно оно говорит:
Окей, я попробовал исправить ситуацию со списком

 def textcutter(winyorwinxortextar, text, winxdefault):
    textsplit = text.split()
    winytext = 1
    curtextsplit = ['']
    if(len(textsplit) == 1):
        winxtext = len(text)
    else:
        for n in range(len(textsplit)):
                curtextsplit[winytext] = textsplit[n]
                if(len(currenttextsplit[winytext]) >= winxdefault):
                    curtextsplit.append('')
                    curtextsplit[winytext] = oldcurtextsplit
                    winytext += 1
                elif(n < len(textsplit)):
                    oldcurtextsplit = curtextsplit[winytext]
                    curtextsplit[winytext] += ' '
    print(winytext)
text = "Какой-то криповый сегодня вечерок, не правда ли, друзья?"
textcutter(1, text, 20)

Но

 Traceback (most recent call last):
  File "C:\Users\danil\Desktop\Python\test.py", line 19, in <module>
    textcutter(1, text, 20)
  File "C:\Users\danil\Desktop\Python\test.py", line 9, in textcutter
    curtextsplit[winytext] = textsplit[n]
IndexError: list assignment index out of range

Проходя через if, индекс добавляется и меняется
Ничего не изменилось
Хз, что делать

Офлайн

#8 Янв. 14, 2019 16:34:53

IfDANCodeR
Зарегистрирован: 2019-01-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Как создать список с изначально неизвестным количеством элементов

IfDANCodeR
Ребят, всё, догнал, всё работает. Спасибо за помощь!

 def textcutter(winyorwinxortextar, text, winxdefault):
    textsplit = text.split()
    winytext = 1
    curtextsplit = ['']
    if(len(textsplit) == 1):
        winxtext = len(text)
    else:
        for n in range(len(textsplit)):
                curtextsplit[winytext-1] = textsplit[n]
                if(len(curtextsplit[winytext-1]) >= winxdefault):
                    curtextsplit.append('')
                    curtextsplit[winytext-1] = oldcurtextsplit
                    winytext += 1
                elif(n < len(textsplit)):
                    oldcurtextsplit = curtextsplit[winytext-1]
                    curtextsplit[winytext-1] += ' '
    print(winytext)
text = "Какой-то криповый сегодня вечерок, не правда ли, друзья?"
textcutter(1, text, 20)

С остальным разберусь

Офлайн

#9 Янв. 14, 2019 17:39:38

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3215
Репутация: +  218  -
Профиль   Отправить e-mail  

Как создать список с изначально неизвестным количеством элементов

IfDANCodeR
что более читаемо curtextsplit или cur_text_split ? textcutter или text_cutter ? oldcurtextsplit или old_cur_text_split ? winytext или win_y_text? Подумайте над этим.
В самом конце, в качестве доп задачки, можете вернуться к этой функции и переписать ее в 2-3 раза лучше/ короче/ эффективнее/ понятнее



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#10 Янв. 14, 2019 20:20:28

uf4JaiD5
Зарегистрирован: 2018-12-28
Сообщения: 76
Репутация: +  4  -
Профиль   Отправить e-mail  

Как создать список с изначально неизвестным количеством элементов

Значит, надо разрезать строку по пробелам (“разделить на слова”), а затем собрать из этих “слов” строки не длинее заданного значения. Так?
Что именно надо вернуть, так и не сказано.

Последний вариант кода просто выводит 1. Ни в curtextsplit, ни в oldcurtextsplit не остаётся ничего осмысленного.

 def add_word(word, line, n):
	if len(word) > n:
		print('Error: "{}" не влезет в {} ({})'.format(word, n, len(word)))
		exit()
	
	if line[0] + len(word) + 1 <= n:
		line.append(word)
		line[0] += len(word) + 1
		return True
	
	return False
	
def cut(text, n):
	out = []
	line = [-1]
	# хранит первым элементом длину, потом "слова"
	for word in text.split():
		if not add_word(word, line, n):
			# строка переполнена, добавить не удалось
			# сохраняем текущую строку, начинаем набирать новую
			out.append(' '.join(line[1:]))
			line = [-1]
			add_word(word, line, n)
	
	if len(line) >1:
		out.append(' '.join(line[1:]))
	
	return out
n = 20
print('-'*n+'|')
for l in cut("Какой-то криповый сегодня вечерок, не правда ли, друзья?", n):
	print(l)

 --------------------|
Какой-то криповый
сегодня вечерок, не
правда ли, друзья?

Отредактировано uf4JaiD5 (Янв. 14, 2019 20:23:50)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version