AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78312055
Accepted
Saeed
Saeed
Asked: 2024-04-12 01:19:58 +0800 CST2024-04-12 01:19:58 +0800 CST 2024-04-12 01:19:58 +0800 CST

Como escrever em arquivos diferentes com base no valor da lista de dictos e concatenar o loop for e três listas de dictos

  • 772

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
python
  • 4 4 respostas
  • 39 Views

4 respostas

  • Voted
  1. inspectorG4dget
    2024-04-12T01:43:32+08:002024-04-12T01:43:32+08:00

    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 o group_namevalor e escrevemos o registro formatado.

    Depois de escrever todos os registros, faremos uma iteração client_packagepara 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ída

    Aqui está o código:

    # create all the output files
    outfiles = {k: open(f"{k}.txt", 'w') for k in client_group_user_counts}
    
    # turn client_package into a dict for easier access
    client_package = {row['client_group']: row['total_income'] for row in client_package}
    
    # write everything to the correct files
    for row in products_income:
        cgroup = row['client_group']
        prodCount = row['count']
        prodName = row['product']
        income = row['monthly_income']
    
        outfile = outfiles[cgroup]
        outfile.write(f"group {cgroup} has {prodCount} product {prodName}, monthly income is {income}.\n")
    
    # add the additional space
    for outfile in outfiles.values():
        outfile.write('\n')
    
    # write the total income summary
    for group, income in client_package.items():
        outfiles[group].write(f"group {group} total income is {income}.\n\n")
    
    # add the users
    for group,users in client_group_user_counts.items():
        outfiles[group].write(f"group {group} has total {len(users)} users, and this is its users:\n")
        for user in users:
            outfiles[group].write(f"{user}\n")
    
    # close the files
    for outfile in outfiles.values():
        outfile.close()
    
    • 2
  2. mozway
    2024-04-12T01:55:49+08:002024-04-12T01:55:49+08:00

    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 withinstrução:

    products = {}
    for d in products_income:
        (products
         .setdefault(d['client_group'], []) 
         .append('group {client_group} has {count} product {product}, monthly income is {monthly_income}.'.format(**d))
        )
    packages = {}
    for d in client_package:
        (packages
         .setdefault(d['client_group'], []) 
         .append('group {client_group} total income is {total_income}.'.format(**d))
        )
    
    for group, users in client_group_user_counts.items():
        with open(f'{group}.txt', 'w') as f:
            f.write('\n'.join(products[group])+'\n\n')
            f.write('\n'.join(packages[group])+'\n\n')
            f.write(f'group {group} has total {len(users)} users, and this is its users:\n')
            f.write('\n'.join(users))
    

    Exemplo 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
    
    • 2
  3. Best Answer
    JonSG
    2024-04-12T01:43:19+08:002024-04-12T01:43:19+08:00

    Como os resultados são agregados por "ID do grupo", você deseja iterar client_group_user_countsprimeiro. Isso também permitirá que você crie open()um arquivo específico para o "ID do grupo" atual

    Isso poderia precisar de alguma refatoração, mas deve lhe dar uma ideia

    Dado:

    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
    }
    

    Tentar:

    for group_key, group_users in client_group_user_counts.items():
        packages = [row for row in client_package if row["client_group"] == group_key]
        products = [row for row in products_income if row["client_group"] == group_key]
        with open(f"{group_key}.txt", "w", encoding="utf-8", newline="") as file_out:
            for product in products:
                file_out.write(f"group {group_key} has {product['count']} product {product['product']}, monthly income is {product['monthly_income']}.\n")
            file_out.write("\n")
            file_out.write(f"group {group_key} total income is {packages[0]['total_income']}.\n")
            file_out.write("\n")
            file_out.write(f"group {group_key} has total {len(group_users)} users, and this is its users:\n")
            for user in group_users:
                file_out.write(f"{user}\n")
    
    • 1
  4. Mohsen_Fatemi
    2024-04-12T01:45:37+08:002024-04-12T01:45:37+08:00

    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_countsvocê pode obter todos os grupos a partir de suas chaves.

    groups = client_group_user_counts.keys()
    

    Agora que você tem todos os grupos, pode iterar sobre os grupos e imprimir o que mencionou acima.

    for group in groups :
        for product in products_income:
            if product['client_group']==group:
                print(f"group {group} has {product['count']} product {product['product']}, monthly income is {product['monthly_income']}.")
        for package in client_package:
            if package['client_group']==group:
                print(f"group {group} total income is {package['total_income']}.")
        print(f"group {group} has total {len(client_group_user_counts[group])} users, and this is its users:")
        print('\n'.join(client_group_user_counts[group]))
        print()
    

    Mas geralmente é recomendado usar bibliotecas como o pandas para realizar tarefas mais complexas.

    • 1

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve