#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
Комментариев нет:
Отправить комментарий