如何根据字符总数将不一致的字段拆分为x次?

2024-09-30 05:29:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试如何在Discord中拆分字段,其中每个字段的字符限制为1024个字符

我的问题是,每当字符在900-2000个字符之间时,我只能将其分为两个列表,但是我确实得到了超过2000个字符的字符(我将在代码中显示的listInfo)

我想弄清楚的是,如何将场分解成x次,其中0-900是一个场,900-1800是第二个场,1800-2700是第三个场等等(每个场是n+900)

data = []

listInfo = [
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167764|EU 40 - [2]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167765|EU 40.5 - [4]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167766|EU 41 - [4]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167767|EU 42 - [4]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167768|EU 42.5 - [8]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167769|EU 43 - [9]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167770|EU 44 - [14]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167771|EU 44.5 - [8]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167772|EU 45 - [16]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167773|EU 45.5 - [8]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167774|EU 46 - [16]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167775|EU 47 - [5]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167776|EU 47.5 - [4]>',
  '<https://www.justrandomlink.com/?controller=cart&add=1&as=true&qty=1&id_product=20798&token=e4d64f25476dcee4b08744d382dc405b&ipa=167777|EU 48.5 - [4]>'
]


if 900 <= sum(len(i) for i in listInfo) < 2000:

    data.append(
        {
            'title': 'Info',
            'value': '\n'.join(listInfo[:len(listInfo)//2]) if len(listInfo) else '*Info not found*',
            'short': True
        }
    )

    data.append(
        {
            'title': '-',
            'value': '\n'.join(listInfo[len(listInfo)//2:]) if len(listInfo) else '*Info not found*',
            'short': True
        }
    )

elif 0 < sum(len(i) for i in listInfo) < 900:
    data.append(
        {
            'title': 'Info',
            'value': '\n'.join(listInfo) if len(listInfo) else '*Info not found*',
            'short': False
        }
    )

我试图找出一个更聪明的方法,我不添加另一个功能,是3分裂,然后为4等


Tags: httpscomtokenaddidtrueaswww
1条回答
网友
1楼 · 发布于 2024-09-30 05:29:48

处理此问题的一种方法是保持当前批大小的运行总数,并使用该总数确定是添加到当前批还是生成新批

data, character_count, i = [], 0, 0
for j, item in enumerate(listInfo):
    if len(item) + character_count > 900:
        data.append('\n'.join(listInfo[i:j]))
        character_count, i = len(item), j
    else:
        character_count += len(item)
if character_count:
    data.append('\n'.join(listInfo[i:]))
if not data:
    data.append('*Info not found*')

如果您可以通过几个步骤来完成这项工作,而不是使用enumerate来跟踪列表中的位置并在枚举中使用.join,那么只需批处理任何新行并担心以后加入它们是可行的

data, character_count = [], 0
for item in listInfo:
    if len(item) + character_count > 900:
        data.append([item])
        character_count = len(item)
    else:
        data[-1].append(item)
        character_count += len(item)
data = ['\n'.join(batch) for batch in data]
if not data:
    data.append('*Info not found*')

这样做的一个问题是占用了大量内存空间。您可以使用名为生成器的工具来继续提供每个批,而不是附加到列表中。如果调用generator的人出于某种原因确实需要一个列表,他们可以从generator中创建一个列表,否则他们只能处理流中的项

def batch(listInfo):
    batch, count = [], 0
    for item in listInfo:
        if len(item) + count > 900:
            yield batch
            batch, count = [item], len(item)
        else:
            batch.append(item)
            count += len(item)
    if batch:
        yield batch
data = ['\n'.join(x) for x in batch(listInfo)]
if not data:
    data.append('*Info not found*')

在某种程度上,仍然存在这样一个问题:您是否希望消息的长度正好为900个字符(可能会拆分传入的消息),或者是否希望消息保持完整。保持消息完整并且只在消息之间进行拆分的一个问题是,列表中的一个项本身可以超过900个字符。我编写的所有代码都隐式地假定情况并非如此,因为在这种情况下,您希望消息的包装、不发送或其他行为的确切方式实际上取决于应用程序

相关问题 更多 >

    热门问题