Detectar caracteres repetidos em sequencia em uma string

784 views
Skip to first unread message

Marcio Bayma

unread,
Aug 4, 2017, 12:57:17 PM8/4/17
to python...@googlegroups.com
Oi pessoal

Dada uma string, por exemplo 'nnnnnn/aaaavv -> nnnnnnnnnn'  eu gostaria de pegar as repetições de string, mas considerar como repetição, apenas se estiverem juntas. Usando a string acima, eu teria portanto 4 repetições:
[  ('n', 6 ), ('a', 4), ('v', 2), ('n', 10) ]

Já tentei usar collections.Counter, dict e outras, mas não consegui ainda gerar desta forma. A "melhor" forma que consegui até agora foi ir percorrendo a string, caractere a caractere, e montando isso. Teria alguma forma melhor de fazer?

Haruo Kamioka

unread,
Aug 4, 2017, 4:15:26 PM8/4/17
to python...@googlegroups.com

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasil+unsubscribe@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Marcio Bayma

unread,
Aug 4, 2017, 4:40:54 PM8/4/17
to python...@googlegroups.com
Haruo, muito obrigado! Funcionou sim. O meu código estava beeem maior, e bem mais complicado. 

Brigadão.


Em 4 de agosto de 2017 15:15, Haruo Kamioka <haruo....@gmail.com> escreveu:

Juan Lopes

unread,
Aug 5, 2017, 1:23:35 PM8/5/17
to python...@googlegroups.com
Uma opção é usar itertools.groupby:

[(a, len(list(b))) for a, b in itertools.groupby(s) if 'a' <= a <= 'z']

Marcio Bayma

unread,
Aug 5, 2017, 1:32:58 PM8/5/17
to python...@googlegroups.com
Valeu Juan... essa solução tinha no link que o Haruo postou. De qualquer forma valeu aí, obrigado.

Em 5 de agosto de 2017 12:23, Juan Lopes <juanp...@gmail.com> escreveu:
Uma opção é usar itertools.groupby:

[(a, len(list(b))) for a, b in itertools.groupby(s) if 'a' <= a <= 'z']

Sinval Júnior

unread,
Aug 10, 2017, 9:54:21 AM8/10/17
to python...@googlegroups.com
Um detalhe? irá desconsiderar acentos? Caso converta a string ascii antes do groupby

Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+

Caio César Lima Borges

unread,
Aug 11, 2017, 8:51:50 AM8/11/17
to Python Brasil
Outra forma de fazer:
import collections

d = collections.defaultdict(int)
for c in SUA_STRING:
    d[c] += 1

Marcelo Valle (BLOOMBERG/ LONDON)

unread,
Aug 11, 2017, 9:18:21 AM8/11/17
to python...@googlegroups.com
Eu acho que nao tem outra forma de fazer, voce tem que percorrer cada char e gerar a lista que vc citou. 
Mas isso eh bem simples, nao eh? 
Pergunta - voce precisa manter a ordem, no resultado final? Por exemplo, te interessa saber que n aparece 2 vezes, uma com 6 chars e outra com 10 chars, ou voce precisa saber que com 6 chars aparece antes de com 10 chars?
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



<< ideas don't deserve respect >>

Marcio Bayma

unread,
Aug 11, 2017, 1:22:00 PM8/11/17
to python...@googlegroups.com
OI Marcelo,

Mas isso eh bem simples, nao eh? 
 
Sim, é bem simples. Mas pensei haver alguma forma mais simples (e os colegas mostraram algumas bem interessantes).

Pergunta - voce precisa manter a ordem, no resultado final? Por exemplo, te interessa saber que n aparece 2 vezes, uma com 6 chars e outra com 10 chars, ou voce precisa saber que com 6 chars aparece antes de com 10 chars?

Basta saber que apareceram 6 n's e depois 10 n's por exemplo. A ordem não importa muito, apenas os grupos de repetições.





Em 11 de agosto de 2017 08:18, Marcelo Valle (BLOOMBERG/ LONDON) <mvalle...@bloomberg.net> escreveu:
Eu acho que nao tem outra forma de fazer, voce tem que percorrer cada char e gerar a lista que vc citou. 
Mas isso eh bem simples, nao eh? 
Pergunta - voce precisa manter a ordem, no resultado final? Por exemplo, te interessa saber que n aparece 2 vezes, uma com 6 chars e outra com 10 chars, ou voce precisa saber que com 6 chars aparece antes de com 10 chars?

Subject: Re:[python-brasil] Re: Detectar caracteres repetidos em sequencia em uma string
Outra forma de fazer:
import collections

d = collections.defaultdict(int)
for c in SUA_STRING:
    d[c] += 1

Em sexta-feira, 4 de agosto de 2017 13:57:17 UTC-3, Marcio Bayma escreveu:
Oi pessoal

Dada uma string, por exemplo 'nnnnnn/aaaavv -> nnnnnnnnnn'  eu gostaria de pegar as repetições de string, mas considerar como repetição, apenas se estiverem juntas. Usando a string acima, eu teria portanto 4 repetições:
[  ('n', 6 ), ('a', 4), ('v', 2), ('n', 10) ]

Já tentei usar collections.Counter, dict e outras, mas não consegui ainda gerar desta forma. A "melhor" forma que consegui até agora foi ir percorrendo a string, caractere a caractere, e montando isso. Teria alguma forma melhor de fazer?
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.


<< ideas don't deserve respect >>

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages