Media in lists with dictionaries

Asked

Viewed 302 times

1

I have 2 lists of dictionaries and 1 dictionary , as for example the following :

lista1 = [
    {'Idade': '8',  'Especie': 'Gato',      'Nome do Animal': 'Felix'},
    {'Idade': '57', 'Especie': 'Tartaruga', 'Nome do Animal': 'Michelangelo'},
    {'Idade': '12', 'Especie': 'Cao',       'Nome do Animal': 'Rantanplian'},
    {'Idade': '2',  'Especie': 'Peixe',     'Nome do Animal': 'Nemo'},
    {'Idade': '45', 'Especie': 'Tartaruga', 'Nome do Animal': 'Leonardo'},
    {'Idade': '9',  'Especie': 'Cao',       'Nome do Animal': 'Milo'},
    {'Idade': '57', 'Especie': 'Tartaruga', 'Nome do Animal': 'Raphael'},
    {'Idade': '4',  'Especie': 'Peixe',     'Nome do Animal': 'Dory'} ]

lista2 = [
    {'Nome do Dono ': 'Ana', 'Nome do Animal': 'Michelangelo'},
    {'Nome do Dono ': 'Eva', 'Nome do Animal': 'Dory'},
    {'Nome do Dono ': 'Ada', 'Nome do Animal': 'Rantanplan'},
    {'Nome do Dono ': 'Ana', 'Nome do Animal': 'Leonardo'},
    {'Nome do Dono ': 'Eva', 'Nome do Animal': 'Felix'},
    {'Nome do Dono ': 'Ana', 'Nome do Animal': 'Raphael'},
    {'Nome do Dono ': 'Eva', 'Nome do Animal': 'Nemo'} ]



dicionario3 ={
 'Eva': ['Dory', 'Felix', 'Nemo'],
 'Ana': ['Michelangelo', 'Leonardo', 'Raphael'],
 'Ada': ['Rantanplan']}

And what I want to do is turn dictionary 3 into a list of dictionaries where instead of the names of the animals the average age of those animals per owner will be and round those values up "for example in the case of Eva the value of 4,6 , soon will have to appear 5 instead of 4. I have tried several things and did not get result , someone can help ?

What I want is this :

[{'Ana':'53','Eva':'5','Ada':'12'}]

My first question is how to get only the names of the animals in the dictionary3

  • I think it would be clearer if you wrote down what is the expected result for the example entry you used. Could you do that? And what things have you tried that haven’t worked? In general it is easier to write a good answer if we know what you have tried and what difficulties you have encountered.

  • I’ve already edited the question @hugomg

2 answers

2

I made the code in Angularjs for you to follow the logic.

Is here: jsFiddle

angular.module('dicionario', [])

.controller('ctrl', function($scope, $http) {

  $scope.lista1 = [{
    'idade': 8,
    'especie': 'Gato',
    'nome': 'Felix'
  }, {
    'idade': 57,
    'especie': 'Tartaruga',
    'nome': 'Michelangelo'
  }, {
    'idade': 12,
    'especie': 'Cao',
    'nome': 'Rantanplan'
  }, {
    'idade': 2,
    'especie': 'Peixe',
    'nome': 'Nemo'
  }, {
    'idade': 45,
    'especie': 'Tartaruga',
    'nome': 'Leonardo'
  }, {
    'idade': 9,
    'especie': 'Cao',
    'nome': 'Milo'
  }, {
    'idade': 57,
    'especie': 'Tartaruga',
    'nome': 'Raphael'
  }, {
    'idade': 4,
    'especie': 'Peixe',
    'nome': 'Dory'
  }];

  $scope.lista2 = [{
    'dono': 'Ana',
    'nome': 'Michelangelo'
  }, {
    'dono': 'Eva',
    'nome': 'Dory'
  }, {
    'dono': 'Ada',
    'nome': 'Rantanplan'
  }, {
    'dono': 'Ana',
    'nome': 'Leonardo'
  }, {
    'dono': 'Eva',
    'nome': 'Felix'
  }, {
    'dono': 'Ana',
    'nome': 'Raphael'
  }, {
    'dono': 'Ana',
    'nome': 'Milo'
  }, {
    'dono': 'Eva',
    'nome': 'Nemo'
  }];

  $scope.especies = [];
  $scope.donos = [];
  $scope.media = [];
  $scope.mediadono = [];

  angular.forEach($scope.lista1, function(lista1) {
    $scope.especies.push(lista1.especie);


    angular.forEach($scope.lista2, function(lista2) {
      if (lista1.nome == lista2.nome){
        lista1.dono = lista2.dono;

      }


    });

  });

    angular.forEach($scope.lista2, function(lista2) {
    $scope.donos.push(lista2.dono);
  });

  jQuery.unique($scope.especies); //tira os duplicados
  jQuery.unique($scope.donos);

  angular.forEach($scope.especies, function(esp) {
    var somarIdade = 0;
    var contarIdades = 0;

    angular.forEach($scope.lista1, function(lista1) {

      if (esp == lista1.especie) {
        contarIdades++;
        somarIdade = somarIdade + lista1.idade;
      }
    });

    $scope.media.push({
      media: somarIdade / contarIdades,
      especie: esp
    });
  });

    angular.forEach($scope.donos, function(dono) {
    var somarIdade = 0;
    var contarIdades = 0;

    angular.forEach($scope.lista1, function(lista1) {

      if (dono == lista1.dono) {
        contarIdades++;
        somarIdade = somarIdade + lista1.idade;
      }
    });

    $scope.mediadono.push({
      media: somarIdade / contarIdades,
      dono: dono
    });
  });



  angular.forEach($scope.lista1, function(lista1) {

angular.forEach($scope.media, function(valor) {

      if (lista1.especie == valor.especie) {
        lista1.media = valor.media;

      }

    });

        angular.forEach($scope.mediadono, function(valor) {

      if (lista1.dono == valor.dono) {
        lista1.mediadono = valor.media;

      }

    });

  });

});


<body ng-app='dicionario'>
  <div ng-controller='ctrl'>
    <table class='table table-bordered table-striped'>
      <thead>
        <tr>
          <th>Espécie</th>
          <th>Nome</th>
          <th>Idade</th>
          <th>Dono</th>
          <th>Media por Animal</th>
           <th>Media por Dono</th>
        </tr>
      </thead>
      <tbody>
        <tr ng-repeat='ax in lista1'>
          <td>{{ax.especie}}</td>
          <td>{{ax.nome}}</td>
          <td>{{ax.idade}}</td>
          <td>{{ax.dono}}</td>
          <td>{{ax.media |number:2}}</td>
          <td>{{ax.mediadono |number:2}}</td>
        </tr>
      </tbody>
    </table>
  </div>
</body>

1


Much like your previous question:

from collections import defaultdict

resultado = defaultdict(list)
media_idades = defaultdict(list)

animais = [
    {'Idade': '8', 'Especie': 'Gato', 'Nome do Animal': 'Felix'},
    {'Idade': '57', 'Especie': 'Tartaruga', 'Nome do Animal': 'Michelangelo'},
    {'Idade': '12', 'Especie': 'Cao', 'Nome do Animal': 'Rantanplian'},
    {'Idade': '2', 'Especie': 'Peixe', 'Nome do Animal': 'Nemo'},
    {'Idade': '45', 'Especie': 'Tartaruga', 'Nome do Animal': 'Leonardo'},
    {'Idade': '9', 'Especie': 'Cao', 'Nome do Animal': 'Milo'},
    {'Idade': '57', 'Especie': 'Tartaruga', 'Nome do Animal': 'Raphael'},
    {'Idade': '4', 'Especie': 'Peixe', 'Nome do Animal': 'Dory'}]

donos = [
    {'Nome do Dono': 'Ana', 'Nome do Animal': 'Michelangelo'},
    {'Nome do Dono': 'Eva', 'Nome do Animal': 'Dory'},
    {'Nome do Dono': 'Ana', 'Nome do Animal': 'Rantanplian'},
    {'Nome do Dono': 'Ana', 'Nome do Animal': 'Leonardo'},
    {'Nome do Dono': 'Eva', 'Nome do Animal': 'Felix'},
    {'Nome do Dono': 'Ana', 'Nome do Animal': 'Raphael'},
    {'Nome do Dono': 'Eva', 'Nome do Animal': 'Nemo'}]

for dono in donos:
    for animal in animais:
        if dono['Nome do Animal'] == animal['Nome do Animal']:
            resultado[dono['Nome do Dono']].append(
                int(animal['Idade'])
            )

# Modificando o  defaultdict para um dicionário normal:
resultado = dict(resultado)

for key, values in resultado.items():
    media_idades[key].append(sum(values)/len(values))


# Modificando o  defaultdict para um dicionário normal:
media_idades = dict(media_idades)

print(media_idades)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.