Dicionário com N valores

To tentando fazer um cadastro de aluno onde 1 aluno tem N notas.

O registro ficaria assim: {'codAluno': [1], 'nome': ['Ana'], 'rg': ['33462111'], 'notas': ['9', '7']}
Quando eu inserir mais um aluno, por exemplo com 3 notas: {'codAluno': [1, 2], 'nome': ['Ana', 'Paulo'], 'rg': ['33462111', '4546556'], 'notas': ['9', '7', '4', '6', '8']}

Então Ana ficou com 2 notas e Paulo com 3 notas.

Como faço para saber quais as notas de Ana e Paulo? Ou eu estou fazendo o dicionário errado?

Preciso dessa informação para fazer a parte para imprimir.

Código do sistema:

Alunos = {'codAluno' : [], 'nome' : [], 'rg' : [], 'notas' : []}
numAlunos = 0
cont = 1

# Menu Aluno ------------------------------------------------------------------------------------------//
ok1 = True
while ok1:

	print("")
	print("1 - Inserir novo aluno")	
	print("2 - Imprimir lista de alunos")
	print("6 - Sair")

	menuAluno = input ("\nDigite o numero da opçao desejada: ")

	## Sair do menu aluno ----------------------------------------------------------------------//
	if menuAluno == '6':
		ok1 = False

	## 1 - Inserir novo aluno ------------------------------------------------------------------//
	if menuAluno == '1':
		
		if numAlunos < 50:			
			codAluno = cont
			nome = input ("Informe o nome do aluno: ")
			rg = input ("Informe o RG do aluno: ")
												
			Alunos['codAluno'].append(codAluno)
			Alunos['nome'].append(nome)
			Alunos['rg'].append(rg)

			opcao = '1'
			while opcao != '0':	
				nota = input ("Informe a nota do aluno: ")
				Alunos['notas'].append(nota)
				opcao = input("Deseja inserir mais notas? 0 = não - 1 = sim")
			
			
			print(Alunos)
			numAlunos = numAlunos + 1
			cont = cont + 1

		else:
			print("\nNumero maximo de Alunos atingido!!")

				
## 2 - Imprimir lista de Alunos -----------------------------------------------------//
	if menuAluno == '2':		
				
		for i, j in Alunos.items():
			print(i)
			for k in j:
				print (k)			
			

print ("Finalizando...")
# FIM do Menu Aluno --------------------------------------------------------------------------//

Se cada aluno pode ter uma quantidade diferente de notas, esta estrutura não é a mais adequada.

Uma sugestão é ter uma lista de alunos, sendo que cada aluno é representado por um dicionário. Algo assim:

[
  { 'codAluno': 1, 'nome': 'Aluno 1', 'rg': '123', 'notas': [7, 8, 6] },
  { 'codAluno': 2, 'nome': 'Aluno 2', 'rg': '456', 'notas': [8, 5] }
]

Assim você isola os dados de cada aluno em um dicionário próprio, em vez de misturar tudo no mesmo (que na minha opinião deixa tudo muito mais confuso).

O programa para criar esta estrutura ficaria assim:

alunos = []
cont = 1
while True: # não precisa da variável ok1
    print("""
1 - Inserir novo aluno
2 - Imprimir lista de alunos
6 - Sair""")

    menuAluno = input("\nDigite o numero da opçao desejada: ")

    if menuAluno == '6':
        break # sai do while

    if menuAluno == '1':
        if len(alunos) < 50: # não precisa de variável para controlar a quantidade, posso obter da própria lista
            nome = input("Informe o nome do aluno: ")
            rg = input("Informe o RG do aluno: ")
            novo_aluno = { 'codAluno': cont, 'nome': nome, 'rg': rg, 'notas': [] }
            while True:
                try:
                    nota = int(input("Informe a nota do aluno: "))
                    novo_aluno['notas'].append(nota)
                    if input("Deseja inserir mais notas? 0 = não - 1 = sim") == '0':
                        break # sai do while
                except ValueError: # validar se foi digitado um número
                    print('Não foi digitado um número válido')
            print(novo_aluno)
            alunos.append(novo_aluno)
            cont = cont + 1
        else:
            print("\nNumero maximo de Alunos atingido!!")
    elif menuAluno == '2':
        for aluno in alunos:
            print(f'nome: {aluno["nome"]}, código: {aluno["codAluno"]}, RG: {aluno["rg"]}, notas: {", ".join(map(str, aluno["notas"]))}')

print ("Finalizando...")

Era isso mesmo que eu precisava. Perfeito, obrigado pela ajuda.

Tem uma outra forma de não usar o map?

Depende de como você quer imprimir as notas, tem vários jeitos de fazer… Se quiser pode só imprimir direto aluno["notas"], por exemplo.

Mas desta forma ele imprime assim: ['9', '8']

Achei que tivesse como iterar dentro do print, exemplo: {for a in aluno['notas']}

Dentro do print não. Se quiser imprimir um por um, tem que fazer um for fora do print.

Se bem que, para imprimir um em cada linha, é só trocar para {"\n".join(map(str, aluno["notas"]))}.

Nesse caso, a melhor forma é o map mesmo.

Apanhando em Python.

Como encontrar um elemento no dicionário dentro da lista?

Tentei, mas da erro:

consultar = int(input("\nInforme o codigo do aluno: "))
consultarV = consultar in alunos['codAluno']

Repare que alunos é uma lista com 2 dicionários. Então alunos['codAluno'] não existe (só existiria se alunos fosse um dicionário).

Na verdade você precisa percorrer a lista, e para cada dicionário dela, verificar se o valor corresponde ao que você quer:

alunos = [
 { 'codAluno': 1, 'nome': 'Aluno 1', 'rg': '123', 'notas': [7, 8, 6] },
 { 'codAluno': 2, 'nome': 'Aluno 2', 'rg': '456', 'notas': [8, 5] }
]

consultar = int(input("\nInforme o codigo do aluno: "))
for aluno in alunos: # para cada dicionário da lista de alunos
    if consultar == aluno['codAluno']: # verifico o código
        print(f'achei: {aluno["nome"]}')
        break # pode interromper o loop, pois já encontrei o aluno
else: # se não encontrar nenhum (se não cair no "break"), ele entra neste else
    print(f'aluno com código {consultar} não encontrado')

Eu usei um for/else (sim, o else aí não é do if, e sim do for). Basicamente, se não cair no break, ele cai no else - leia a documentação para saber mais.


Como dica geral, eu diria para não tentar coisas aleatórias. Tente primeiro entender as estruturas da linguagem (o que são listas, dicionários, como funcionam os operadores como in, etc), entenda o que cada parte é, e só aí escreva o código. Vai ser bem menos “traumático” :slight_smile:

Depois de:

Fiz assim:

alunos[0]['codAluno']

Até que funcionou, mas o problema é o índice 0. Não sabia como por uma variável.
Seu método me ajudou mais uma vez. Obrigado.
Sei mexer no Java. Mas to apanhando no Python.