Em primeiro lugar, sinto muito se a pergunta for muito longa. Tentei incluir o mínimo de dados, mas pude acrescentar.
Estas são as listas que tenho:
products_income = [
{'client_group': 'A', 'count': 2, 'product': 'A', 'monthly_income': 370},
{'client_group': 'B', 'count': 1, 'product': 'B', 'monthly_income': 215},
{'client_group': 'C', 'count': 3, 'product': 'C', 'monthly_income': 495},
{'client_group': 'A', 'count': 2, 'product': 'D', 'monthly_income': 304},
{'client_group': 'B', 'count': 1, 'product': 'E', 'monthly_income': 110},
{'client_group': 'B', 'count': 2, 'product': 'F', 'monthly_income': 560},
{'client_group': 'A', 'count': 1, 'product': 'G', 'monthly_income': 196},
]
client_package = [
{'client_group': 'A', 'total_income': 870},
{'client_group': 'B', 'total_income': 885},
{'client_group': 'C', 'total_income': 495}
]
client_group_user_counts = {
'A': ['user1', 'user2', 'user3', 'user4', 'user5'], # 5 users
'B': ['user21', 'user22', 'user23', 'user24'], # 4 users
'C': ['user41', 'user42', 'user43'], # 3 users
}
Esta é a saída da minha loja, e esta é a saída esperada para serem gravados diferentes arquivos chamados por ' client_group
.txt':
A.txt
:
group A has 2 product A, monthly income is 370.
group A has 2 product D, monthly income is 304.
group A has 1 product G, monthly income is 196.
group A total income is 870.
group A has total 5 users, and this is its users:
user1
user2
user3
user4
user5
B.txt
:
group B has 1 product B, monthly income is 215.
group B has 1 product E, monthly income is 110.
group B has 2 product F, monthly income is 560.
group B total income is 885.
group B has total 4 users, and this is its users
user21
user22
user23
user24
C.txt
:
group C has 3 product C, monthly income is 495.
group C total income is 495.
group C has total 3 users, and this is its users:
user41
user42
user43
Este é o meu código atual e ainda não alcancei a saída esperada (na verdade, atualmente não sei como escrever em arquivos separados neste caso, além do outro problema do meu código):
# I added this function, because I had error in the last line of next code block inside the `f-string`, so I thought that could be a workaround for this
def to_join():
return '\n'.join(client_group_user_counts[user])
for product in products_income:
for client in client_package:
for user in client_group_user_counts:
if product['client_group'] == client['client_group'] == user:
print(f"""group {product['client_group']} has {product['count']} product {product['product']}, monthly income is {product['monthly_income']}.
total income is {client['total_income']}.
group {product['client_group']} has total {len(client_group_user_counts[user])} users, and this is its users:
{to_join()}
""")
Esta é a saída atual:
group A has 2 product A, monthly income is 370.
group A total income is 870.
group A has total 5 users, and this is its users:
user1
user2
user3
user4
user5
group B has 1 product B, monthly income is 215.
group B total income is 885.
group B has total 4 users, and this is its users:
user21
user22
user23
user24
group C has 3 product C, monthly income is 495.
group C total income is 495.
group C has total 3 users, and this is its users:
user41
user42
user43
group A has 2 product D, monthly income is 304.
group A total income is 870.
group A has total 5 users, and this is its users:
user1
user2
user3
user4
user5
group B has 1 product E, monthly income is 110.
group B total income is 885.
group B has total 4 users, and this is its users:
user21
user22
user23
user24
group B has 2 product F, monthly income is 560.
group B total income is 885.
group B has total 4 users, and this is its users:
user21
user22
user23
user24
group A has 1 product G, monthly income is 196.
group A total income is 870.
group A has total 5 users, and this is its users:
user1
user2
user3
user4
user5
Aqui está a lógica:
Você já tem todos os nomes de grupos no formato
client_group_user_counts
. Vamos usar isso para gerar vários arquivos. Também mapearemos nomes de grupos para nomes de arquivos (não exatamente obrigatório para este programa, mas é útil caso sua lógica fique mais complexa no futuro).Então, vamos iterar
products_income
. Procuramos o nome do arquivo de saída com ogroup_name
valor e escrevemos o registro formatado.Depois de escrever todos os registros, faremos uma iteração
client_package
para escrever a receita total. Mas espere, reformataremos esse dicionário para que as chaves sejam os nomes dos grupos e os valores sejam a receita total - isso apenas nos poupará algumas etapas de pesquisa.Finalmente, iremos iterar
client_group_user_counts
. Como as chaves já são nomes de grupos, podemos usá-las para procurar o arquivo de saída. Então só precisamos escrever os próprios nomes de usuário no arquivo de saídaAqui está o código:
Eu primeiro reformularia os dicionários para evitar que eles fossem ultrapassados mais tarde.
Em seguida, faça um loop apenas uma vez sobre cada chave e abra o arquivo com uma
with
instrução:Exemplo
A.txt
:Como os resultados são agregados por "ID do grupo", você deseja iterar
client_group_user_counts
primeiro. Isso também permitirá que você crieopen()
um arquivo específico para o "ID do grupo" atualIsso poderia precisar de alguma refatoração, mas deve lhe dar uma ideia
Dado:
Tentar:
Não sei se entendi a estrutura do seu programa ou não, se estiver errado, corrija o meu. Como você possui os grupos,
client_group_user_counts
você pode obter todos os grupos a partir de suas chaves.Agora que você tem todos os grupos, pode iterar sobre os grupos e imprimir o que mencionou acima.
Mas geralmente é recomendado usar bibliotecas como o pandas para realizar tarefas mais complexas.