Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Entendendo o laço for e a lista do python

Não entendi muito o laço for do python. Ele inicializa com um item da lista e a condição é a própria lista?

def listar(nomes):
    print 'Listando nomes:'
    for nome in nomes:
        print nome

No entanto, ao usar tentar usar esse código para alterar um item da lista não funcionou.

Função alterar (sei que a construção está errada conforme a resposta do exercício):

def alterar(nomes):
    print 'Qual nome você gostaria de alterar?'
    nome = raw_input()
    for nome in nomes:
        if(nome==nomes[nome]):
            print 'Insira o nome nome:'
            novo_nome = raw_input()
            nomes[nome] = novo_nome

O erro apresentado:

Digite: 1 para cadastrar
2 para listar
3 para remover
4 para alterar
0 para terminar
4
Qual nome você gostaria de alterar?
maria
Traceback (most recent call last):
  File "app.py", line 44, in <module>
    menu()
  File "app.py", line 41, in menu
    alterar(nomes)
  File "app.py", line 22, in alterar
    if(nome==nomes[nome]):
TypeError: list indices must be integers, not str

O mais interessante é que ele diz que o índice da lista deve ser um inteiro e não uma string, mas como funcionou na meu for da função listar?

Outra coisa: no if (conforme abaixo) o 'in' funciona como um '==', e o if além de fazer a verificação ele já percorre a lista?

def alterar(nomes):
    print 'Qual nome vc gostaria de alterar?'
    nome_a_alterar = raw_input()

    if(nome_a_alterar in nomes):
        posicao = nomes.index(nome_a_alterar)
        print 'Digite novo nome:'
        nome_novo = raw_input()
        nomes[posicao] = nome_novo
4 respostas

Olá Geovane, tudo bem?

É o seguinte quando você usa o "for x in lista" no Python o "x" passa a receber os elementos da lista, por isso o IDE emitiu o erro dizendo que o índice da lista precisa ser um inteiro ao invés de uma String.

Exemplo:

listaNomes = ["João", "Jose", "Maria", "Gustavo", "Amanda"]

for nomes in listaNomes:
    print nomes

Nesse caso o programa vai dar "print" nos nomes: João, Jose, Maria, Gustavo e Amanda.

No caso do seu programa você tentou utilizar mais ou menos um listaNomes["João"] que acabou gerando o erro.

Quanto a pergunta do "if in" seguindo o exemplo acima se você digitar o comando abaixo:

if ("João" in listaNomes):
    print "João pertence a lista"

Ele ira dar "print" em "João pertence a lista", pois ele ira percorrer a lista em busca dessa String.

Espero ter esclarecido todas as suas dúvidas. Boa jornada de estudos. ^^

solução!

Olá Geovane,

Acho que vocẽ está confundindo os dois tipos de for loops.

Você está pensando no For Condicional que sempre avalia uma condição antes de executar o loop de novo.

Porém também temos o forEach que sempre percorrerá a estrutura de dados inteira. No caso uma lista.

"for each" = para cada elemento da minha estrutura de dados (ex: lista) faça alguma coisa.

E no python, escrevemos dessa forma

for nome in nomes:
        print nome

E lemos como: Para cada nome (estamos escolhendo o nome da variavel aqui, poderia ser item, por exemplo).

"Para cada nome da minha lista nomes, faça:"

Quanto ao erro apresentado, ele está ligado à confusão com os tipos de for (:

Veja, para acessar um valor na lista em um for condicional usamos:

lista[i] //onde i é o iterador

Mas no forEach, para acessar o valor de um elemento usamos a variável direto (no caso, "nome") mas como eu falei antes, poderia ser "item". Ex:

for item in nomes:
        print item

Assim, quando você tentou escrever

nomes[nome]

ele tentou fazer algo como:

nomes["joao"]

E por isso deu um erro de tipagem, pois para acessar o valor de uma lista ele esperava um valor do tipo inteiro.

Ficou mais claro?

Obrigado Augusto.

Então Lucas , o problema do meu erro eu já tinha entendido. No entanto, não entendia o porquê de em um for ele aceitar nome como iterador e no outro não. Mas você explicou bem. Na verdade são laços diferentes. Eu realmente não sabia do forEach, não lembro dele no C (a minha primeira linguagem na programação).

Obrigado pela resposta!