Media in lists with dictionaries

0

I have 2 lists of dictionaries and 1 dictionary, such as 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 intend to do is to turn dictionary 3 into a list of dictionaries, where instead of the names of the animals the average age of these animals per owner will be rounded up, for example in the case of Eva the value of 4,6, then it will have to appear 5 instead of 4. I tried several things and I did not get results, can anyone help?

What I want is this:

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

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

    
asked by anonymous 24.04.2016 / 16:54

2 answers

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)
    
25.04.2016 / 00:31
2

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

You are 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>
    
25.04.2016 / 00:20