Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

gonca16

teclas para palavra

Mensagens Recomendadas

gonca16

Bom dia

Tenho aqui uma função para fazer que é a seguinte, por exemplo naqueles teclados de telemovel que a cada numero tem 3 ou 4 letras eu tenho que fazer um funçao que recebe por exemplo "222 2333 33" e a isto a função tem que devolver a palavra cafe, nao estou a entender por onde posso fazer isto.

Desde já obrigado,

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

gonca16,

O que fizeste até ao momento? Que dúvidas tens especificamente?

Já tentaram resolver o teu problema aqui no fórum, embora numa outra linguagem (pesquisa um pouco).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gonca16

desde já obrigado pela resposta, ate ao momento tenho isto:

def teclas_para_palavra(string):
   D={'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrt','8':'tuv','9':'wxyz'}

   for i in range(len(string)):
       print D[string[i]]

criei um dcionario que me pareceu a melhor opçao para o tipo de exercício e fiz um ciclo for para percorrer a string ate agr ele devolve as 3 letras associadas ao numero portanto agora é arranjar uma maneira de lidar com as repetições por exemplo se forem dois 2 ele tem de devolver um b é esta a parte que não consigo como é que eu lido com as repetições

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Uma dica: podes utilizar o número de repetições como indicativo da posição da letra, ou seja: 222 é 'c' porque acedes à entrada '2' do dicionário... e na terceira posição dessa string encontra-se o 'c'.

Tenta primeiro fazer uma função que converta um código para 1 letra. Depois é só aplicar isso a grupos de códigos :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
icemonster2

A tua forma de pensar ao fazeres o dicionário está correta.

O que precisas de fazer depois, é separar a string em varias partes(as partes estao separadas por um espaço atualmente). Para isso há a função "split", nas strings. vai pesquisar sobre isso.

Depois de separares em varias strings, percorres cada uma e convertes.

A minha sugestão para esse ultimo passo, é teres um contador i = 0, que significa o indice onde vai começar a proxima letra.

para contar o numero de '3' na string '2333', podes usar a função "count". Assim, em cada iteração, acedias assim ao dicionário: D[ string_atual ][ string_atual.count(string_atual)-1 ].

Para o caso da string '2333', com o numero '3', o contador i seria 1 nesse momento e ficava D['2333'[1]]['2333'.count('2333'[1])-1] = D['3]['2333'.count('3')-1] = 'def'[3-1] = 'f'

Pronto, já te disse mais ou menos todos os instrumentos que precisas de usar. Agora é contigo para fazere o código

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gonca16

isto tem que ser feito apenas numa funçao, por exemplo se eu tiver a string '444 888' e fizer

print string.split()

isto vai dar ['444', '555'] qual é o metodo que eu posso usar para fazer uma lista de listas de modo a ficar [[444],[888]]

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
icemonster2

Não precisas de ter uma lista de listas. Se fizeres lista = string.split() da tua string atual ("222 2333 33") vais ficar com

lista = ['222','2333','33']

supondo que vais pela minha maneira de fazer:

for string in lista:
   i = 0
   while i != len(string):
       n = string.count(string[i])-1
       print D[ string[i] ][n]
       i += n

Editado por thoga31
Tags code + GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gonca16

eu estava mesmo a fazer dessa maneira o meu erro foi no ciclo for nao estava a fazer assim ja agr qual é a vantagem de ter o ciclo while em vez de um for dentro de um for?

Existe alguma maneira de fazer ele dar a volta por exemplo no 88888 ele devolver a letra u por enquanto se eu fizer istoele diz string index out of range o que é normal porque so tem 3 elementos como é que eu faço para ele dar a volta à string

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
icemonster2

A diferença entre o while e o for, é que no while tu não sabes quantas iterações vais ter, enquanto que o for tem que ser um numero definido.

Nesse caso tive que usar um while, porque não sabia após quantas iterações a variável i chegaria ao fim da sub-string. Isto aconteçe porque a variável i não é incrementada em cada iteração, é em vez disso adicionado a ela um numero que não consegues calcular previamente(mais ou menos). i += n

Repara que todos os problemas que possas resolver com um for, também podes resolver com o while. Porém, nem todos os problemas que consegues resolver com um while podem ser resolvidos com o for. Muita gente diz que o for, quando pode ser aplicado, é mais eficiente que o while. Provavelmente é assim, mas não tenho a certeza disso

Editado por icemonster2

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

isto tem que ser feito apenas numa funçao (...)

Todo o exercício tem que ser feito numa única função? Para mim o ideal seria teres 3 funções: uma para converter um «código» (chamemos-lhe assim) numa letra, outra para converter uma string num conjunto de «códigos» e outra que simplesmente aplica a primeira a cada grupo gerado pela segunda.

Exemplo:

def tochar(code):
   'Converte um código numa letra. Ex.: tochar("88888") => "u"'
   ...

def codes(string):
   'Converte uma string numa lista de códigos. Ex.: codes("22 2333") => ["22", "2", "333"]'
   ...

def decode(keys):
   'Converte uma string de teclas numa mensagem de texto. Ex.: decode("2 22 222") => "abc"'
   return ''.join([ tochar(c) for c in codes(keys) ])

Existe alguma maneira de fazer ele dar a volta por exemplo no 88888 ele devolver a letra u por enquanto se eu fizer istoele diz string index out of range o que é normal porque so tem 3 elementos como é que eu faço para ele dar a volta à string

Sim, existe. Tens que recorrer ao operador de módulo (o %). Por exemplo nesse caso, 88888 tem tamanho 5, e a tecla 8 tem 3 letras disponíveis. Logo, se fizeres 5 % 3 obténs 2, que corresponde ao 'u' (2ª posição da tecla 8).

Repara que todos os problemas que possas resolver com um for, também podes resolver com o while. Porém, nem todos os problemas que consegues resolver com um while podem ser resolvidos com o for. Muita gente diz que o for, quando pode ser aplicado, é mais eficiente que o while. Provavelmente é assim, mas não tenho a certeza disso

Atenção: enquanto que em C o ciclo com for pode ser feito com um while (e vice-versa), em Python isso já não é bem assim. Em Python o for está altamente especializado para lidar com objectos iteráveis, com diversas optimizações que isso traz consigo em termos de memória (e também rapidez). Tipicamente, quando se pode utilizar um for em Python, deve-se utilizá-lo.

Editado por pwseo
Adicionada clarificação sobre ciclos em Python

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
icemonster2

Atenção: enquanto que em C o ciclo com for pode ser feito com um while (e vice-versa), em Python isso já não é bem assim. Em Python o for está altamente especializado para lidar com objectos iteráveis, com diversas optimizações que isso traz consigo em termos de memória (e também rapidez). Tipicamente, quando se pode utilizar um for em Python, deve-se utilizá-lo.

Se reparares disseste exatamente o que eu disse por outras palavras x)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Se reparares disseste exatamente o que eu disse por outras palavras x)

Disseste que não tinhas a certeza do que tinhas dito, por isso decidi reforçar a ideia. Além disso, achei pertinente referir precisamente o porquê de ser boa ideia utilizar o for quando ele está disponível, algo que também não tinha sido dito.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gonca16

pois é, eu tambem acho que dividindo as funçoes ficava bastante mais organizado mas como isto depois tenho de fazer o grafo e uma data de testes eles dizem uma só função, optei por fazer com dois ciclos for, todos os problemas em python pensoi que podem ser resolvidos com os dois no entanto aconcelham sempre a dar preferencia ao for portanto eu só não utilizo for se para sair dele tiver de fazer um break;

Este é o meu codigo ate agora:

D={'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrt','8':'tuv','9':'wxyz'}
string='333'
L=[]
lista=string.split()
for string in lista:
 for i in range(len(string)):
   rep = string.count(string[i])-1
   if string[i]=='7' or string[i]=='9':
     L.append(D[string[i]][(len(string)-1)%4])

   else:
     L.append(D[string[i]][(len(string)-1)%3])

print L

isto depois é para ser uma função tenho só assim para ser mais fácil testar, têm alguma sugestão para lidar com casos por exemplo '2333' que deveria de dar 'af'

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

Há várias abordagens possíveis a este problema. A minha passaria por identificar e isolar as sequências (X caracteres Y seguidos), e depois substituir pelos caracteres correspondentes a esses X toques na tecla Y. Algo deste género:

chars = {'2': 'abc', '3': 'def'}
string = "222 2333 33"

contador = 1
seqs = []

for caracter in string:
   if caracter != caracter_seguinte: #esta sequencia chegou ao fim
       guardar_sequencia
       contador = 1
   else: #o numero de caracteres iguais seguidos esta a aumentar
       contador += 1

string_final = reduce(lambda acc, sequencia: acc+chars[sequencia.tecla][sequencia.nr_de_toques], seqs, '') # 
print string_final

Esta é a ideia base, tenta seguir esta linha de pensamento.


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.