Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Разбить строку на N символов (подстрок одинаковой длины) и занести в массив

#python #массивы #строки


Имеется строка из X символов, необходимо разбить её на N символов и забить значения
по переменным, если в конечном значении отсеченная часть меньше, чем N, то мы её удаляем.
На примере:
Имеется строка London_is_the_capital_of_great_Britain. Её необходимо разбить на группы
по 6 символов и каждую группу внести в отдельную строчную переменную (или в массив).

s='London_is_the_capital_of_great_Britain'
[s[x:x+6] for x in range (0, len(s), 6)]
['London', '_is_th', 'e_capi', 'tal_of', '_great', '_Brita', 'in']


Здесь видно, что последняя группа содержит менее 6 символов, значит мы ее не должны
заносить в отдельную переменную, а просто отсечь.
    


Ответы

Ответ 1



В itertools-recipes приведен пример реализации функции grouper, которая принимает на вход итерируемый объект и число, обозначающее размер последовательностей, на которые будет разбит исходный объект. В основе функции лежит zip_longest - может быть заменена на встроенный zip (комментарий jfs). def grouper(iterable, n): args = [iter(iterable)] * n return zip(*args) s = 'London_is_the_capital_of_great_Britain' l = [''.join(i) for i in grouper(s, 6)] print(l) ['London', '_is_th', 'e_capi', 'tal_of', '_great', '_Brita']

Ответ 2



Чтобы выбросить группу, которая меньше по длине, в конце списка: n = 6 chunks = [s[i - n:i] for i in range(n, len(s) + 1, n)] Ещё (из @slippyk комментария): chunks = [s[i:i + n] for i in range(0, len(s) - (len(s) % n), n)] Более наглядно предел для i можно записать как: n * (len(s) // n)— выражение делает длину s как будто кратной n. Если список не нужен: chunks = map(''.join, zip(*[iter(s)] * n)) Первый вариант более читаем. Последний вариант работает не только для последовательностей. zip() автоматически не кратный остаток выкидывает. Вот объяснение, что zip(*[iterator]*n) делает. Пример: >>> s = 'London_is_the_capital_of_great_Britain' >>> print(*map(''.join, zip(*[iter(s)] * 6)), sep=' | ') London | _is_th | e_capi | tal_of | _great | _Brita

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

Отправить комментарий