TransWikia.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!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP