É possível dividir uma string a cada enésimo caractere?
Por exemplo, suponha que eu tenha uma sequência que contenha o seguinte:
'1234567890'
Como faço para que fique assim:
['12','34','56','78','90']
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']
Apenas para concluir, você pode fazer isso com uma regex:
Para um número ímpar de caracteres, você pode fazer isso:
Você também pode fazer o seguinte, para simplificar a regex para pedaços mais longos:
E você pode usar
re.finditer
se a sequência for longa para gerar pedaço por pedaço.fonte
'.'*n
para deixar mais claro. Sem junção, sem zíper, sem loops, sem compreensão de lista; basta encontrar os próximos dois caracteres um ao lado do outro, que é exatamente como o cérebro humano pensa sobre isso. Se Monty Python ainda estivesse vivo, ele adoraria esse método!flags=re.S
.Já existe uma função embutida em python para isso.
Isto é o que a documentação do wrap diz:
fonte
wrap
pode não retornar o que é solicitado se a string contiver espaço. por exemplo,wrap('0 1 2 3 4 5', 2)
os retornos['0', '1', '2', '3', '4', '5']
(os elementos são retirados)Outra maneira comum de agrupar elementos em grupos de comprimento n:
Este método vem diretamente dos documentos para
zip()
.fonte
zip(*[iter(s)]*2)
difícil de entender, leia Comozip(*[iter(s)]*n)
funciona no Python? .>>> map(''.join, zip(*[iter('01234567')]*5))
->['01234']
zip()
comitertools.zip_longest()
:map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
maps()
Eu acho que isso é mais curto e mais legível que a versão itertools:
fonte
Eu gosto desta solução:
fonte
Usando more-itertools do PyPI:
fonte
Você pode usar a
grouper()
receita deitertools
:Python 2.x:
Python 3.x:
Essas funções são eficientes na memória e funcionam com quaisquer iteráveis.
fonte
Tente o seguinte código:
fonte
yield ''.join(piece)
para fazê-lo funcionar como esperado: eval.in/813878fonte
Tente o seguinte:
Resultado:
fonte
Como sempre, para quem gosta de um forro
fonte
print(line)
eu recebothis is a line split into n characters
como saída. Você poderia estar melhor colocandoline = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
:? Corrija isso e é uma boa resposta :).,blah
e por que é necessário? Percebo que posso substituirblah
por qualquer caractere alfa, mas não números, e não consigo remover ablah
ou / e a vírgula. Meu editor sugere adicionar espaços em branco após,
: senumerate
retorna duas iteráveis, então você precisa de dois lugares para colocá-las. Mas você não precisa do segundo iterável para nada neste caso.blah
eu prefiro usar um sublinhado ou sublinhado duplo, consulte: stackoverflow.com/questions/5893163/...Uma solução recursiva simples para string curta:
Ou de tal forma:
, que ilustra o padrão típico de divisão e conquista na abordagem recursiva de forma mais explícita (embora praticamente não seja necessário fazê-lo dessa maneira)
fonte
Eu estava preso no mesmo cenário.
Isso funcionou para mim
Resultado
fonte
more_itertools.sliced
já foi mencionado antes. Aqui estão mais quatro opções damore_itertools
biblioteca:Cada uma das últimas opções produz a seguinte saída:
Documentação para opções discutidas:
grouper
,chunked
,windowed
,split_after
fonte
Isso pode ser conseguido por um loop for simples.
A saída é semelhante a ['12', '34', '56', '78', '90', 'a']
fonte