Повторное соединение массива слов с указанием c количества строк - PullRequest
0 голосов
/ 18 июня 2020

Я стремлюсь сделать что-то похожее на то, что обычно можно сделать с чем-то вроде textwrap.wrap, но вместо обтекания текста максимальной длиной I wi sh вместо этого указать , сколько строк .

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

Вот что у меня есть; num - это количество строк, которые мне нужны, words - это массив слов. wpc - (неверное) предположение о том, сколько «слов в блоке»:

num = 4
words = [
  "The",
  "quick",
  "brown",
  "fox",
  "jumps",
  "over",
  "the",
  "lazy",
  "dog"
]
wpc = math.ceil(len(words)/num)
chunks = [' '.join(words[num*i:num*(i+1)]) for i in range(wpc)]

Это дает неверный результат:

[
  "The quick brown fox",
  "jumps over the lazy",
  "dog"
]

В котором 3 строки, а не 4 требуемые .

И список слов, и количество требуемых строк - это динамика c, где я ошибаюсь?

Правильный вывод немного сомнительный ... одна возможность -

[
  "The quick brown",
  "fox jumps",
  "over the",
  "lazy dog"
]

Но, конечно, строка «3 слова» может быть где угодно. Не имеет большого значения, как размещается нечетная строка (первая, последняя, ​​случайная), если всегда есть num строк.

Кроме того, если вы добавите больше слов, было бы хорошо распределить их равномерно слова (опять же, меня не слишком волнует, как они распределяются):

[
  "The quick brown",
  "giant fox jumps",
  "over the very",
  "lazy dog"
]

1 Ответ

2 голосов
/ 18 июня 2020

Вы перевернули использование wpc и num, а использование ceil здесь неверно - я думаю.

Вот решение:

import math

num = 4
words = [
  "The",
  "quick",
  "brown",
  "fox",
  "jumps",
  "over",
  "the",
  "lazy",
  "dog"
]
wpc = math.floor(len(words)/num)
chunks = [' '.join(words[wpc*i:wpc*(i+1)]) for i in range(num)]

chunks[-1] = " ".join([chunks[-1]] + words[wpc * num:])

Результат:

['The quick', 'brown fox', 'jumps over', 'the lazy dog']

Решение с равномерным распределением:

Это немного сложнее. В принципе, я понимаю, какое минимальное количество слов на фрагмент (в данном случае 2), и произвольно распределяю лишние слова между некоторыми фрагментами.

num = 4
words = [
  "The",
  "quick",
  "brown",
  "fox",
  "jumps",
  "over",
  "the",
  "lazy",
  "dog", 
    "bla"
]

base_words_per_chunk = math.floor(len(words)/num)
extra_words = len(words) - num * base_words_per_chunk
words_per_chunk = [base_words_per_chunk] * num

larger_chunks = random.sample(range(num), extra_words)
for inx in larger_chunks:
    words_per_chunk[inx] = words_per_chunk[inx] + 1

start_point = 0
chunks = []
for inx in itertools.accumulate(words_per_chunk):
    chunk = words[start_point:inx]
    chunks.append(chunk)
    start_point = inx
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...