Как я могу автоматически разделить список на основе заданного требования?

#python #discord #discord.py #discord.py-rewrite

#python #Discord #discord.py

Вопрос:

В Discord вы можете получать сообщения длиной не более 2000 символов. Я пытаюсь добавить имя сервера, количество участников и идентификатор сервера для каждого сервера, на котором находится бот, в список, а затем отправить список на канал.

Однако, поскольку длина списка превышает 2000, я попытался разделить его, однако метод требует, чтобы он обновлялся каждый раз вручную по мере увеличения списка. Как я могу заставить скрипт автоматически разбивать список на основе того, сколько «разделений» требуется, а затем отправлять эти «разделения»?

Что у меня есть на данный момент, что работает, но не является автоматическим:

 @commands.command()
async def getallservers(self, ctx):
    serverslist = []

    def split_list(alist, wanted_parts=1):
        length = len(alist)
        return [ alist[i*length // wanted_parts: (i 1)*length // wanted_parts] 
                for i in range(wanted_parts) ]

    if ctx.author.id == 204616460797083648:
        for x in self.bot.guilds:
            serverslist.append(f'{x.name}: **{len(x.members)}** - {x.id}n')

        q1,q2,q3,q4,q5,q6 = split_list(serverslist, wanted_parts=6)

        embed = discord.Embed(title='Server List')

        embed.description = ''.join(q1)
        await ctx.send(embed=embed)
        embed.description = ''.join(q2)
        await ctx.send(embed=embed)
        embed.description = ''.join(q3)
        await ctx.send(embed=embed)
        embed.description = ''.join(q4)
        await ctx.send(embed=embed)
        embed.description = ''.join(q5)
        await ctx.send(embed=embed)
        embed.description = ''.join(q6)
        await ctx.send(embed=embed)
    else:
        pass
  

Комментарии:

1. Напрямую не связано, но вы должны использовать встроенные проверки библиотеки вместо if owner: ... else: pass внутри команды.

2. Да — это была просто временная функция, которую я добавил для тестирования команды — обязательно изменю ее! Спасибо!

3. Пожалуйста, не создавайте лишней работы для других людей, вандализируя свои сообщения. Размещая в сети Stack Exchange, вы предоставляете Stack Exchange право, не подлежащее отзыву, в соответствии с лицензией CC BY-SA 4.0 , распространять этот контент (т. е. независимо от вашего будущего выбора). Согласно политике Stack Exchange, распространяется версия post, не подвергшаяся вандализму. Таким образом, любой вандализм будет отменен. Если вы хотите узнать больше об удалении записи, пожалуйста, смотрите: Как работает удаление?

Ответ №1:

Тот, который у вас есть serverslist , вы можете передать его функции, которая создает страницы из < 2000 символов

 def paginate(lines, chars=2000):
    size = 0
    message = []
    for line in lines:
        if len(line)   size > chars:
            yield message
            message = []
            size = 0
        message.append(line)
        size  = len(line)
    yield message
  

затем в вашей команде

 for message in paginate(serverlist):
    embed.description = ''.join(message)
    await ctx.send(embed=embed)
  

Комментарии:

1. Большое вам спасибо!