Найти - Пользователи
Полная версия: Как создать список с изначально неизвестным количеством элементов
Начало » Python для новичков » Как создать список с изначально неизвестным количеством элементов
1 2
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] = 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 

Как избавиться от этой ошибки?
marvellik
IfDANCodeR для начала
вставляете свой код в окно сообщений затем выделяете его от начала и до конца удерживая л.к.м. и после выделения когда ваш код уже выделен синим идете вверх окна рядом с смайликом слева наводите на стрелку а затем жмете PYTHON и ваш код будет полным и читаемым. а так не читаемый код
IfDANCodeR
marvellik
IfDANCodeR для начала вставляете свой код в окно сообщений затем выделяете его от начала и до конца удерживая л.к.м. и после выделения когда ваш код уже выделен синим идете вверх окна рядом с смайликом слева наводите на стрелку а затем жмете PYTHON и ваш код будет полным и читаемым. а так не читаемый код
Исправил
PEHDOM
все правильно оно говорит:
 winytext = 1
curtextsplit = []
...
   curtextsplit[winytext] = textsplit[n]
У вас curtextsplit пустой список, там нету ни одного элемента, а вы пытаетесь изменить его первый!!!(тоесть по факту второй) элемент.

IfDANCodeR
В теории, он должен разделять текст на строки, чтобы они по длине не превышали winxdefault
на практике он делает что угодно но только не это.
Rafik
Для добавления в конец списка имеется хорошая функция append
 curtextsplit.append(textsplit[n])
Насколько я понимаю, в список curtextsplit будет идти добавление последовательно: первая строка идёт первым элементом, вторая - следующий и т.д.
IfDANCodeR
Rafik
Для добавления в конец списка имеется хорошая функция append
Окей
Но дело-то в том, что таким образом из curtextsplit получится тот же список из слов, что и textsplit
А мне нужно, чтобы цикл проходил через if, менялось winytext, выставлялись пробелы, и только когда winytext меняется на следующее значение (когда набирается количество знаков, меньше, чем winxdefault, но при этом следующее слово добавляет количество символов, не влазящее в winxdefault (это последнее слово и не вписывается)), следовательно, уже тогда менялся индекс curtextsplit
Так вот, как добавлять в конец строки элементы (в строку с нужным индексом)?
IfDANCodeR
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, индекс добавляется и меняется
Ничего не изменилось
Хз, что делать
IfDANCodeR
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)

С остальным разберусь
JOHN_16
IfDANCodeR
что более читаемо curtextsplit или cur_text_split ? textcutter или text_cutter ? oldcurtextsplit или old_cur_text_split ? winytext или win_y_text? Подумайте над этим.
В самом конце, в качестве доп задачки, можете вернуться к этой функции и переписать ее в 2-3 раза лучше/ короче/ эффективнее/ понятнее
uf4JaiD5
Значит, надо разрезать строку по пробелам (“разделить на слова”), а затем собрать из этих “слов” строки не длинее заданного значения. Так?
Что именно надо вернуть, так и не сказано.

Последний вариант кода просто выводит 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)

 --------------------|
Какой-то криповый
сегодня вечерок, не
правда ли, друзья?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB