AnswerBun.com

Como compara um item com todos os outros itens da mesma lista (com dicionários dentro) de uma forma pythonica?

Stack Overflow em Português Asked by MMelo on December 19, 2020

Sou iniciante, galera. Só para constar!

Estou tentando comparar os itens de uma lista com dicionários e se eles são iguais, somar esses itens. Acho que com um exemplo, a ideia fica mais clara:

dados = [
        {"Codigo": 1, "Valor": 300.00,},
        {"Codigo": 1, "Valor": 300.00,},
        {"Codigo": 2, "Valor": 400.00,},
        {"Codigo": 1, "Valor": 300.00,},
        {"Codigo": 2, "Valor": 400.00,},
        {"Codigo": 2, "Valor": 400.00,}
]

print(f'Número de itens: {len(dados)}')

for dado in dados:
    print(f"{dado['Codigo']} = {dado['Valor']}")

A dúvida é: Se os valores de Codigo são iguais – Como somar esses valores em um item e retornar somente o valor total somado?

Obrigado pela atenção!

2 Answers

Se o intuito for apenas pedagógico podes fazer um group by 'manual', e ir somando:

dados = [
        {"Codigo": 1, "Valor": 300.00,},
        {"Codigo": 1, "Valor": 300.00,},
        {"Codigo": 2, "Valor": 400.00,},
        {"Codigo": 1, "Valor": 300.00,},
        {"Codigo": 2, "Valor": 400.00,},
        {"Codigo": 2, "Valor": 400.00,}
]

dados_grouped = {}
for d in dados:
    dados_grouped[d['Codigo']] = dados_grouped.get(d['Codigo'], 0) + d['Valor']

Output de dados_grouped:

{1: 900.0, 2: 1200.0}

Função get()


Para coisas 'mais sérias' podes usar pandas:
import pandas as pd
df = pd.DataFrame(dados)
dados_grouped = df.groupby('Codigo', as_index=False).sum().to_dict('records')

Output de dados_grouped:

[{'Codigo': 1.0, 'Valor': 900.0}, {'Codigo': 2.0, 'Valor': 1200.0}]

Mas é importante sabermos que existem outras maneiras de fazer isto em python.

Correct answer by Miguel on December 19, 2020

Pare para pensar... você precisa percorrer uma lista e somar os valores de chaves ja encontradas, correto?

Então você precisa de alguma maneira, durante a iteração da lista somar os valores por chaves.

Então está claro que você precisa ter uma nova estrutura de dados para armazenar esses valores somados, durante a iteração.

Para isso você pode utilizar uma estrutura de chave/valor(hashmap) e após executar as somas, você le essa nova estrutura e transforma na nova lista com os valores somados.

Irei fazer em JS pois não conheço Python. E vejo que isso é falta de conhecimento em conceitos de estrutura de dados e programação básica do que uma dúvida sobre Python de fato

const lista = [
  {"Codigo": 1, "Valor": 300.00},
  {"Codigo": 1, "Valor": 300.00},
  {"Codigo": 2, "Valor": 400.00},
  {"Codigo": 1, "Valor": 300.00},
  {"Codigo": 2, "Valor": 400.00},
  {"Codigo": 2, "Valor": 400.00}
];

const tempHashMap = {};

for (item of lista) {
  if (tempHashMap[item.Codigo] != null) {
    tempHashMap[item.Codigo] = tempHashMap[item.Codigo] + item.Valor;
  } else {
    tempHashMap[item.Codigo] = item.Valor
  }
}

const chavesDoHashMap = Object.keys(tempHashMap);

const novaLista = [];

for (chave of chavesDoHashMap) {
  novaLista.push({
    Codigo: chave,
    Valor: tempHashMap[chave]
  });
}

for (item of novaLista) {
  console.log(`${item.Codigo} = ${item.Valor}`)
}

Answered by Giovane on December 19, 2020

Add your own answers!

Related Questions

Socket entre 2 dispositivos

2  Asked on December 18, 2020 by beto

   

Mock variável local dentro de método com mockito e spring boot

1  Asked on December 17, 2020 by samuel-oliveira-chaves

         

Checkbox obrigatória ao apertar o botão

1  Asked on December 17, 2020 by vincius-lodi

 

Row com details na Datatable

1  Asked on December 17, 2020 by jlia-larissa-schultz

   

Estrutura Package IntelliJ

1  Asked on December 16, 2020 by caioabreudev

     

O uso de imutabilidade

1  Asked on December 14, 2020 by dougg0k

         

Problema ao adicionar SVG no React Native

1  Asked on December 14, 2020 by pedro-vinicius

     

Como colocar linhas em um gráfico e barra?

2  Asked on December 13, 2020 by djavan-pereira

 

Posso ter mais de um diretório Views em MVC?

2  Asked on December 12, 2020 by joo-carlos

         

Colo alocar uma memória baseado no tamanho do que o usuário digitou

3  Asked on December 11, 2020 by levi-ivanovsk

     

Listar duas tabelas mysql pdo

1  Asked on December 11, 2020 by leno-sousa

     

É possivel desestruturar um objeto dentro de outro objeto?

1  Asked on December 11, 2020 by christopher-william-buscoski-s

     

CMD, PowerShell, Bash – Qual a diferença?

1  Asked on December 9, 2020 by jos

         

Converter SQL query para Query Builder (Laravel)

1  Asked on December 9, 2020 by luciano-junior

         

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP