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

TypeError ao iterar com a função set()

Essa foi a solução que construi para o exercício:

permissoes_principais = set(['leitura', 'escrita', 'execução', 'compartilhamento'])
solicitadas1 = set(input('Digite as permissões solicitadas para o usuário 1, separadas por vírgula: ').strip().lower().split(','))
solicitadas2 = set(input('Digite as permissões solicitadas para o usuário 2, separadas por vírgula: ').strip().lower().split(','))
print('Permissões principais:', permissoes_principais)
print('Permissões solicitadas para o usuário 1:', solicitadas1)
print('Permissões solicitadas para o usuário 2:', solicitadas2)
for i in range(len(solicitadas1)):
    solicitadas1[i] = solicitadas1[i].strip()
for i in range(len(solicitadas2)):
    solicitadas2[i] = solicitadas2[i].strip()
if solicitadas1.issubset(permissoes_principais):
    print('Usuário 1 tem permissões válidas.')
else:
    print('Usuário 1 tem permissões inválidas.')
if solicitadas2.issubset(permissoes_principais):
    print('Usuário 2 tem permissões válidas.')
else:
    print('Usuário 2 tem permissões inválidas.')

Porém ao rodar o código recebi a mensagem a baixoTypeerror retorna ao rodar o código
Tentei rodar o código fornecido na solução do exercício e também tive o mesmo erro de retorno, mas não sei como resolver. Alguém cosegue me ajudar a entender qual correção precisa ser feita? Obrigado.

3 respostas
solução!

Olá Tayrone! Tudo bem?

O erro que você está enfrentando ocorre porque conjuntos (set) em Python não suportam indexação. Isso significa que você não pode acessar elementos de um conjunto usando índices, como está tentando fazer com solicitadas1[i].

Para resolver esse problema, você pode usar uma compreensão de conjunto para aplicar o strip() a cada elemento antes de criar o conjunto. Aqui está uma maneira de ajustar seu código:

permissoes_principais = set(['leitura', 'escrita', 'execução', 'compartilhamento'])

solicitadas1 = set(perm.strip() for perm in input('Digite as permissões solicitadas para o usuário 1, separadas por vírgula: ').strip().lower().split(','))
solicitadas2 = set(perm.strip() for perm in input('Digite as permissões solicitadas para o usuário 2, separadas por vírgula: ').strip().lower().split(','))

print('Permissões principais:', permissoes_principais)
print('Permissões solicitadas para o usuário 1:', solicitadas1)
print('Permissões solicitadas para o usuário 2:', solicitadas2)

if solicitadas1.issubset(permissoes_principais):
    print('Usuário 1 tem permissões válidas.')
else:
    print('Usuário 1 tem permissões inválidas.')

if solicitadas2.issubset(permissoes_principais):
    print('Usuário 2 tem permissões válidas.')
else:
    print('Usuário 2 tem permissões inválidas.')

Dessa forma, você garante que todos os elementos estão sem espaços em branco antes de serem adicionados ao conjunto.

Espero ter ajudado e bons estudos!

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

Muito obrigado, dessa forma o código funcionou!
Só fiquei com uma dúvida a variável perm não foi declarada anteriormente, entendi que ela foi utilizada somente nos ternários.
No caso ela funciona parecido com um i in range(0, 5) em laços de iteração?

Oi, Tayrone!

A variável perm não precisa ser declarada antes porque ela é criada automaticamente dentro da compreensão de conjunto.

Quando você escreve:


solicitadas1 = set(perm.strip() for perm in input().split(','))

O perm funciona como a variável de controle de um laço for. É exatamente o mesmo conceito de:


for perm in input().split(','):
    print(perm)

Ou comparando com seu exemplo:


for i in range(0, 5):
    print(i)

Assim como o i, a variável perm:

  • É criada no momento da iteração
  • Existe apenas dentro daquele laço
  • Recebe cada elemento da sequência, um por vez

No caso específico:


set(perm.strip() for perm in input().split(','))

O que acontece é:

  1. input().split(',') gera uma lista.
  2. O for perm in ... percorre cada item dessa lista.
  3. Para cada item, o perm.strip() é executado.
  4. O resultado já vai sendo colocado dentro do set.

Ou seja, perm é só a variável temporária que representa cada elemento durante a iteração, exatamente como o i no for.

Fico à disposição!