Суммирование и объединение длин строк таким образом, чтобы длина строк удовлетворяла условию

Предположим, у меня есть список строк, и я хотел сделать из них твит. Например:

# should be two tweets total 
this_list = ["Today is monday tomorrow is tuesday the next" ,"will be friday and after that", "saturday followed by sunday", "this month is march the next", "april after that may followed", "by june then july then we", "have august then", "september and october finishing", "the year with november and december" ]

мой желаемый результат будет похож на этот (конечно, сохраненный в списке):

tweet 1:  'Today is monday tomorrow is tuesday the next will be friday and after that saturday followed by sunday this month is march the next april'
tweet 2:  'after that may followed by june then july then we have august then september and october finishing the year with november and december'

Я пытался использовать цикл while для достижения этого, но я не уверен, что цикл работает правильно...

out = [] # empty list
s = 0 # counter
tweet = "" # string to add too 
while s < 140:
    for x in this_list:
        tweet += x
        s += len(x)
    out.append(tweet)
print(len(out))


tweet += x - Вы просто добавляете одно и то же слово снова и снова, пока s >= 140. Попробуйте поменять местами петли while и for. Или, может быть, удалить while.
Johnny Mopp 22.03.2022 22:20

Вы также не добавляете пробелы между словами и не учитываете эти пробелы при расчете s.

Johnny Mopp 22.03.2022 22:21

Добавьте несколько операторов печати в свой код, чтобы увидеть, что происходит не так. Вы можете решить свою проблему самостоятельно.

blarg 22.03.2022 22:55

сделал несколько обновлений @Johnny Mopp, я изначально тоже это учитывал. Также твиттер не считает пробел символом.

Jerald Achaibar 23.03.2022 02:04

@blarg моя лучшая попытка приблизила меня к желаемому результату; но оно добавляло одно и то же слово снова и снова, как указал Джонни Мопп

Jerald Achaibar 23.03.2022 02:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это не самый пифонический способ сделать это. Но это довольно ясно и наглядно разбивает логику:

mylist = ['Today', 'is', 'monday', 'tomorrow', 'is', 'tuesday', 'the', 'next', 'will', 'be', 'friday', 'and', 'after', 'that', 'saturday', 'followed', 'by', 'sunday', 'this', 'month', 'is', 'march', 'the', 'next', 'april', 'after', 'that', 'may', 'followed', 'by', 'june', 'then', 'july', 'then', 'we', 'have', 'august', 'then', 'september', 'and', 'october', 'finishing', 'the', 'year', 'with', 'november', 'and', 'december']

position = 0 #We keep track of the position, because we might reach the end of the list without meeting the 140 chars criteria
n_chars = 0 #character counting variable
list_of_tweets = []
iter_string = ''
for word in mylist:

    if (n_chars < 140): #We keep adding words to our sentence as max number of chars is not reached
        iter_string = iter_string + word + ' '
        n_chars = n_chars + len(word) + 1 #+1 because of the space we add
        if (n_chars >= 140):
                    list_of_tweets.append(iter_string[:-1]) #We delete the last char as it is a space
                    iter_string = ''
                    n_chars = 0

    if (position == len(mylist)-1):
        list_of_tweets.append(iter_string[:-1])

    position = position + 1 #We are advancing to the next word in the iteration

print(list_of_tweets)
Ответ принят как подходящий

В итоге я использовал список кортежей, содержащих длину и текст; затем суммируя длины, пока не встретится 140 символов.

lot = [(len(i),i) for i in output] # list of tuples (length, txt)
out = [] # store tweets
y=0 # count len of tweets
t= '' # empty tweet 
for l, txt in lot:
    y += l
    t += txt
    if y >= 140:
        t= ''
        y = 0
    else:
        if y>= 119: # I want the 'full tweet' not building blocks
            print(t)
            out.append(t)

len(out) #number of tweets 


Другие вопросы по теме