Grupos digitados distribuidos aleatoriamentes na listas A,B,C,D

Galera alguém pode dar um help no código? Estou querendo que os grupos digitados sejam distribuidos aleatoriamentes na listas A,B,C,D. Mas quando executo algumas lista ficam faltando dados. PYTHON

import random
A = []
B = []
C = []
D = []
c1 = []
c2 = []
S2 = []
b = 0
for k in range(12):
    nome = input('Digite seu nome: ')
    idade = int(input('Sua idade: '))
    serie = int(input('Qual sua serie?: '))
    if serie == 1 or serie == 2 or serie == 3:
        c2.append(2)
    if serie == 1:
        c1.append(1)
    print('')
    dados = (f'Nome: {nome} Idade: {int(idade)} Serie: {int(serie)}')
    lista = random.choice([A, B, C, D])
    lista2 = random.choice([B])
    lista3 = random.choice([C, D])
    lista4 = random.shuffle([D])
    if lista == A and len(A) < 3 and dados not in A:
        b = random.randint(0, 11)
        A.append(f'Nome: {nome} Idade: {int(idade)} Serie: {int(serie)}')
    if lista == B and len(B) < 3 and dados not in A and dados not in B and dados not in C:
        b = random.randint(0, 11)
        B.append(f'Nome: {nome} Idade: {int(idade)} Serie: {int(serie)}')
    if lista == C and len(C) < 3 and dados not in C and dados not in B and dados not in A:
        b = random.randint(0, 11)
        C.append(f'Nome: {nome} Idade: {int(idade)} Serie: {int(serie)}')
    if lista == D and len(D) < 3 and dados not in C and dados not in B and dados not in A:
        b = random.randint(0, 11)
        D.append(f'Nome: {nome} Idade: {int(idade)} Serie: {int(serie)}')


print('')
print(A)
print(B)
print(C)
print(D)
print('')
print('Grupo A')

for k in range(0, 3):
    if len(A) > 1:
        print(A[k])
print('')
print('Grupo B')
for q in range(0, 3):
    if len(B) > 1:
        print(B[q])
print('')
print('Grupo C')
for w in range(0, 3):
    if len(C) > 1:
        print(C[w])
print('')
print('Grupo D')
for s in range(0, 3):
    if len(D) > 1:
        print(D[s])
print('')
print(f'A media de alunos do 1 ano inscritos: {(len(c1)/len(c2)*100):.02f}')

Olá, @HomeDown! Bem vindo ao fórum.

Tem diversos pequenos problemas ou lógicas complicadas demais no seu código.

Pra começar, dentro de um código tudo pode ser abstraído, então você não precisa realmente ter as variáveis “A, B, C, D” para representar as turmas “A, B, C, D”. Você pode ter simplesmente um vetor de 4 posições, em que a primeira posição representa a turma A, a segunda a B, e assim por diante.

Já nos IFs para atribuir aleatoriamente os alunos, você está usando uma lógica muito mais complexa do que o necessário. Você poderia simplesmente verificar se o valor está dentro de uma faixa de números, e atribuir cada faixa à uma sala. A solução mais indicada, porém, é simplesmente usar o resto da divisão pela quantidade de turmas, que será um número entre 0 e (quantidade de turmas -1), justamente os índices do vetor (0-3), e isso é dado de graça pelo método random.randint(min,max).

Não vejo porque verificar se o aluno já está na sala, mas isso poderia ser simplificado usando um identificador por aluno (não é atoa que existem RGs, CPFs, número de cadastro na academia, …).

Para garantir o limite da turma, poderia ser utilizado uma variável de controle e um loop que só sai quando essa variável for igual à verdadeiro. Ou seja, “enquanto o aluno não foi inserido, continua tentando”.

Por fim, para imprimir, não é necessário verificar sempre o índice. Se você sabe que o método “len()” retorna o tamanho do vetor, dá para usar isso para criar o loop.

Além disso, a linguagem Python fornece algumas estruturas de dados bem interessantes, como os sets e os dicionários (5. Data Structures — Python 3.8.3 documentation). Basicamente você pode criar relações entre valores bem facilmente como, por exemplo, relacionar um número ao nome da turma:

nome_turmas = {0: 'A', 1: 'B', 2: 'C', 3: 'D'}
print("Quantidade de turmas é: "+str(len(nome_turmas)))
for k, v in nome_turmas.items():
    print(str(k)+' = ',v)

Então, colocando isso tudo em prática, um código-fonte que resolve o problema seria:

import random

nome_turmas = {0: 'A', 1: 'B', 2: 'C', 3: 'D'}

# Inicializa o vetor de turmas e depois os vetores de cada turma:
turmas = []
for t in range(0,len(nome_turmas)):
    turmas.append([])

max_rand = len(nome_turmas)-1
for k in range(12):
    nome = input('Digite seu nome: ')
    idade = int(input('Sua idade: '))
    serie = int(input('Qual sua serie?: '))
    print('')
    dados = (f'Nome: {nome} Idade: {int(idade)} Serie: {int(serie)}')

    inseriu = False
    while not inseriu:
        r = random.randint(0,max_rand)
        if (len(turmas[r]) <= 3):
            turmas[r].append(dados)
            inseriu = True

print('')
print(turmas)
for id, nome in nome_turmas.items():
    print('')
    print('Grupo '+nome+':')
    print(turmas[id])

Também é possível fazer isso sem usar vetores, com base nessas outras estruturas de dados, como no exemplo abaixo:

import random
turmas = {
    0: {'nome': 'A', 'alunos': []},
    1: {'nome': 'B', 'alunos': []}
}
for aluno in range(12):
    t = random.choice(turmas)
    t['alunos'].append(aluno)
print(turmas)
1 Curtida

Esqueci de avisar, mas, o grupos precisam ser limitados pra ter 3 pessoas diferentes, por isso estava tentando verificar se tinha 1 aluno na mesma sala para então passar pra outra e assim ficar 3 em cada. mas obrigado!!!

1 Curtida

Gostei da brincadeira e fui um pouco mais além, para criar um algoritmo que não use “while”. Tive que dar uma pesquisada para lembrar como que filtrava uma lista, mas o resto não é tão complicado.

import random

nome_turmas = {0: 'A', 1: 'B', 2: 'C', 3: 'D'}
turmas = {}
for id, nome in nome_turmas.items():
    turmas[id] = {'nome': nome, 'alunos': [], 'lotado': False}

for aluno in range(12):
    turmas_nao_lotadas = list(filter(lambda k: not turmas[k]['lotado'] , nome_turmas))
    t = random.choice(turmas_nao_lotadas)
    turmas[t]['alunos'].append(aluno)
    if (len(turmas[t]['alunos']) >= 3):
        turmas[t]['lotado'] = True

Mas o algoritmo faz exatamente isso. Perceba que o aluno só é inserido se o tamanho da turma for menor ou igual a 3. O único “bug” previsto para esse algoritmo é se o usuário cadastrar mais de uma vez o mesmo usuário, mas como eu falei, isso poderia ser feito usando um ID ou modificar a condição de inserção. Ex.:

if (len(turmas[r]) <= 3) and (dados not in turmas[r]):

Porém, não é uma boa ideia comparar strings desse jeito. O ideal seria ter uma estrutura de dados para o aluno, ex.:

aluno = {'nome': 'meu nome', 'id': 1, 'serie': 2}
1 Curtida