3
respostas

unpacking usando list e enumerate

Oi gente, tudo bem?

Pra mim ficou bastante claro o modo de unpacking usando o laço for com enumerate, consegui reproduzir aqui e deu super certo. Entretanto, tentei buscar uma forma de fazer a mesma coisa, mas ao invés de usar o enumerate com laço for, gostaria de fazer o mesmo unpacking usando o modo lazy e passando o enumerate.

Veja até aonde cheguei:

1 . Criei meu dataset

cadastro = [
    ('Rafael', 39, 1984),
    ('José', 67, 1956),
    ('Renato', 44, 1979),
    ('Julia', 37, 1986)
    ]
  1. Gerei uma saída com enumerate para meu dataset e em seguida transformei ele numa lista
print('enumera usando enumerate\n')

enumeratecadastro = enumerate(cadastro)
print(enumeratecadastro)
enumeratecadastro_list = list(enumeratecadastro)
print(enumeratecadastro_list)
  1. como saída obtive a posição de memória e as tuplas enumeradas corretamente:
<enumerate object at 0x000001CA0FA8BF00>
[(0, ('Rafael', 39, 1984)), (1, ('José', 67, 1956)), (2, ('Renato', 44, 1979)), (3, ('Julia', 37, 1986))]
  1. Entretanto, ao fazer o unpacking, o retorno vai ser do par índice x tupla e não dos argumentos da tupla individualizados, como deveria ser:
for valor1, valor2, valor3 in enumeratecadastro_list:
    print(valor1, valor2)

Alguma forma de contornar isso?

Desde já muuiiito obrigado pelo apoio sempre!

3 respostas

Oi, Rafael, tudo bem?

Fico feliz em saber que você conseguiu entender o unpacking usando o laço for com enumerate.

No entanto, no seu exemplo, ao fazer o unpacking do enumeratecadastro_list, você está obtendo o par índice x tupla ao invés dos argumentos da tupla individualizados. Isso acontece porque o enumerate retorna uma sequência de tuplas contendo o índice e o valor correspondente. Um possível solução para obter o unpacking dos argumentos da tupla seria, reescrever o laço forda seguinte maneira:

for indice, tupla in enumeratecadastro_list:
    valor1, valor2, valor3 = tupla
    print(valor1, valor2)

O código acima irá percorrer cada elemento da lista cadastro_list, que contém tuplas com três valores, desempacotar essas tuplas em três variáveis e imprimir os dois primeiros valores de cada tupla na mesma linha.

Espero ter ajudado. Caso tenha dúvidas, não hesite em postar no fórum!

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Oi Rodrigo. Por aqui tudo ótimo. Obrigado pela força!

Entendi a sua construção, no entanto, eu não queria que o "valor1, valor2, valor3" fossem passados como atributos fixos por que eu posso não saber exatamente quantos elementos existem naquela tupla. Por isso precisamos deixar de alguma forma mais genérica.

Uma maneira que eu encontrei de contornar seria, dentro do laço for do enumerate, transformar o argumento tupla em uma list:

for indice, dados_cadastrais in enumeratecadastro:
    dados_cadastrais_lista = list(dados_cadastrais)

E depois criei um outro for para varrer essa lista pelos seus respectivos elementos, usando range e len:

for i in range(len(dados_cadastrais_lista)):

E aí eu concateno o índice do primeiro for com o valor correspondente da list do segundo laço for:

        resultado = [indice, dados_cadastrais_lista[i]]
        print(resultado)

Veja que aqui eu consigo o índice correto pra cada elemento que eu queria concatenar:

[0, 'Rafael']
[0, 39]
[0, 1984]
[1, 'José']
[1, 67]
[1, 1956]
[2, 'Renato']
[2, 44]
[2, 1979]
[3, 'Julia']
[3, 37]
[3, 1986]

Mais ainda ficou uma dúvida:

Como eu faço para esses elementos aparecerem em uma tupla ou em uma lista em vez de aparecem como alimentos separados sem repetir os índices? Eu gostaria que o resultado fosse a seguinte tupla (ou lista):

[0, 'Rafael', 39 1, José, 67, 1956, 2, Renato, 44, 1979 3, Julia, 37, 1986]

Alguma sugestão?

O código completo ficou:

cadastro = [
    ('Rafael', 39, 1984),
    ('José', 67, 1956),
    ('Renato', 44, 1979),
    ('Julia', 37, 1986)
    ]


enumeratecadastro = enumerate(cadastro)
print(enumeratecadastro)

for indice, dados_cadastrais in enumeratecadastro:
    dados_cadastrais_lista = list(dados_cadastrais)
    for i in range(len(dados_cadastrais_lista)):
        resultado = [indice, dados_cadastrais_lista[i]]
        print(resultado)
    

Oi, Rafael,

Desculpe a demora em te responder!

Para obter o resultado desejado, você pode usar a função enumerate para obter o índice de cada tupla em cadastro e, em seguida, criar uma lista contendo os elementos na ordem desejada. Você pode fazer isso da seguinte forma:

cadastro = [
    ('Rafael', 39, 1984),
    ('José', 67, 1956),
    ('Renato', 44, 1979),
    ('Julia', 37, 1986)
]

result = []  # Inicialize uma lista vazia para armazenar o resultado

for indice, dados_cadastrais in enumerate(cadastro):
    # Extraia os elementos da tupla
    nome, idade, ano = dados_cadastrais

    # Adicione os elementos à lista de resultados na ordem desejada
    result.extend([indice, nome, idade, ano])

print(result)

Se preferir uma tupla em vez de uma lista, você pode usar tuple(result) para converter a lista em uma tupla.

Espero ter ajudado. Caso tenha dúvidas, conte com o fórum. Abraços!