boucle de dico et liste

boucle de dico et liste - Python - Programmation

Marsh Posté le 09-09-2016 à 15:21:24    

Re bonjour,
J'ai effacé le topic afin de repartir sur de"bonnes "bases
 
j'ai un dictionnaire type:
projet2:[{projet1;pourcentage1;longueur1},{projet1b;pourcentage1b;longueur1b},{projet1c;pourcentage1c;longueur1c}..]
 
je souhaite comparer pourcentage1 pourcentage1b pourcentage1c et récupérer le pourcentage le plus élevé
 
         si 2 pourcentages sont identiques alors je souhaite comparer les 2 longueurs pour récupérer la plus grande et la mettre dans un dico_max
 
         si  les 2 pourcentages sont identiques et que les 2 longueurs sont identiques alors je les récupère pour les mettre dans un autre dico (dico_doublon)
 
J'ose pas mettre de code, pour ne pas me faire engueuler  :D


Message édité par iguanic le 09-09-2016 à 15:28:20
Reply

Marsh Posté le 09-09-2016 à 15:21:24   

Reply

Marsh Posté le 10-09-2016 à 18:29:43    

Le format que tu as indiqué est erroné.
 
Et sans savoir comment sont stockées réellement tes valeurs, difficile de t'aider sur la façon de procéder.


---------------
On croit souvent avoir vu le fond de la stupidité humaine, et il parfois nécessaire qu'on vous rappelle qu'elle n'a pas de fond.
Reply

Marsh Posté le 10-09-2016 à 21:12:05    

Voici un exemple de mon dictionnaire
clef = nom de famille
valeur=liste de prénom age taille
Dujardin:[{Jean ;48 ;180};{Pierre ;64 ;164}]
Lelouche:[{Gilles ;48 ;180};{Claude ;64 ;164};{Pierre;64 ;164}]
 
Je veux récupérer 2 sorties à savoir
Dico_unique  
Dujardin:[{Pierre ;64 ;164}]
 
Dico_doublon
Lelouche:[{Claude ;64 ;164};{Pierre;64 ;164}]
 
 
 

Reply

Marsh Posté le 11-09-2016 à 02:23:23    

Euh, je comprend toujours pas  :o  
 
Un dictionnaire est un tableau associatif, clé, valeur, on peut mettre n'importe quel type en clé et valeur.
 
Le ; comme séparateur n'existe pas en python, de plus en python faire {'pierre', 64, 164} n'est pas un dictionnaire mais un set.
Tu aurais fait {'nom':'pierre, 'age':64, 'taille':164} là on a bien un dictionnaire.
 
Bon admettons ceci, ce qui ressemble au format supposé.
 
nom : liste de tuples contenant prénom, âge, taille
 

Code :
  1. dico = {'Dujardin':[('Jean', 48, 180),
  2.                     ('Pierre', 64, 164),
  3.                    ],
  4.         'Lelouche':[('Gilles', 48, 180),
  5.                     ('Claude', 64, 164),
  6.                     ('Pierre', 64, 164),
  7.                    ],
  8.         }


 
Pour trouver doublons, et liste à valeur unique, ça donne :
 

Code :
  1. # En premier, parcours du dico dans un ordre précis
  2. # pour enregistrer les index des doublons
  3. listeTemp = []
  4. indexDoublons = set()
  5. i = 0
  6. for nom in sorted(dico.keys()) :
  7.     for attributs in dico[nom] :
  8.         if attributs in listeTemp :
  9.             for j, v in enumerate(listeTemp) :
  10.                 if attributs == v :
  11.                     last = j
  12.             indexDoublons.add(i)
  13.             indexDoublons.add(last)
  14.         i += 1
  15.         listeTemp.append(attributs)
  16. # Même topo pour récupérer les doublons
  17. # On profite au passage pour créer un doublon du dico
  18. # Afin de virer les éléments doublons
  19. from copy import deepcopy
  20. dicoTemp = deepcopy(dico)
  21. doublons = {}
  22. i = 0
  23. for nom in sorted(dico.keys()) :
  24.     for j, attributs in enumerate(dico[nom]) :
  25.         if i in indexDoublons :
  26.             del(dicoTemp[nom][j])
  27.             doublons[nom] = attributs
  28.         i += 1
  29. # Et en dernier, parcours du dico temp pour
  30. # récupérer les liste à 1 élément
  31. uniques = {}
  32. for nom, attributs in dicoTemp.items() :
  33.     if len(attributs) == 1 :
  34.         uniques[nom] = attributs
  35.        
  36. print('Doublons :', doublons)
  37. print('Uniques :', uniques)


 
Comme tu peux le voir, c'est assez lourd, et je ne peux que te conseiller de stocker tes données dans une bdd, et là avec une, ou deux requêtes, ça devrait être torché pour obtenir ces deux résultats.


---------------
On croit souvent avoir vu le fond de la stupidité humaine, et il parfois nécessaire qu'on vous rappelle qu'elle n'a pas de fond.
Reply

Marsh Posté le 11-09-2016 à 15:34:00    

En effet, c’est surtout compliqué pour mon niveau…  
Je pensais qu’il fallait une boucle while sur la longueur de la liste  while i<len(..) .
Ensuite, je ne comprends pas  cette partie
 

Code :
  1. for j, v in enumerate(listeTemp) :
  2.                   if attributs == v :
  3.                       last = j
  4.               indexDoublons.add(i)
  5.               indexDoublons.add(last)


d’après ce que j’ai lu énumerate renvoie une liste de tuples avec indice (j), valeur (v)
mais ensuite je ne vois pas ce que tu en fais avec le add. Comment est ce que ça se compare les uns aux autres
 
Désolé pour mes questions (et ma synthaxe) de débutant.
Pour la bdd c'est impossible pour diverses raisons, mais je dois poursuivre un script python déjà commencé.

Reply

Marsh Posté le 11-09-2016 à 19:06:29    

add est une méthode de set, c'est l'équivalent de append pour les listes.
L'avantage avec un set est le dédoublonnage automatique.
 
En plus je viens de me rendre compte qu'avec les valeurs uniques, mon script va merdouiller, puisque en supprimant, il y aura un décalage d'index, donc faudra modifier en conséquence.
 
Si tu n'as pas de possibilité d'utiliser un client sgbd lourd, il existe sqlite dispo en standard dans pyton, c'est léger et portable.
Tu peux au pire créer une bbd, effectuer tes requêtes, et supprimer la bdd, un sgbdr sera toujours plus performant pour faire ce genre de comparaisons qu'un script python.
 
Un test rapide avec tes valeurs :
 

Code :
  1. import sqlite3
  2. dico = {'Dujardin':[('Jean', 48, 180),
  3.                     ('Pierre', 64, 164),
  4.                    ],
  5.         'Lelouche':[('Gilles', 48, 180),
  6.                     ('Claude', 64, 164),
  7.                     ('Pierre', 64, 164),
  8.                    ],
  9.         }
  10.        
  11. connexion = sqlite3.connect('personnes.db')
  12. cur = connexion.cursor()
  13. table = """
  14. CREATE TABLE PERSONNES(
  15. id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  16. nom VARCHAR(255) NOT NULL,
  17. prenom VARCHAR(255) NOT NULL,
  18. age INT NOT NULL,
  19. taille INT NOT NULL
  20. )
  21. """
  22. cur.execute(table)
  23. connexion.commit()
  24. for nom, attributs in dico.items() :
  25.     for proprietes in attributs :
  26.         prenom, age, taille = proprietes
  27.         cur.execute('INSERT INTO PERSONNES(nom, prenom, age, taille) VALUES(?, ?, ?, ?)', (nom, prenom, age, taille))
  28. connexion.commit()
  29. selectDoublons = """
  30. SELECT id, nom, prenom, age, taille
  31. FROM PERSONNES
  32. WHERE prenom || age || taille
  33. IN
  34. (SELECT prenom || age || taille
  35. FROM PERSONNES
  36. GROUP BY prenom, age, taille
  37. HAVING COUNT(*) > 1
  38. )
  39. ORDER BY prenom, age, taille
  40. """
  41. cur.execute(selectDoublons)
  42. donnees = cur.fetchall()
  43. for valeurs in donnees :
  44.     print(valeurs)


 
Bon je suis rouillé en sql, y'a sûrement moyen de faire mieux, et pour récupérer les valeurs uniques après dédoublonnage, je laisse la main :D
Je suppose qu'il faut jouer sur des tables temporaires comme ce que j'ai fait.


---------------
On croit souvent avoir vu le fond de la stupidité humaine, et il parfois nécessaire qu'on vous rappelle qu'elle n'a pas de fond.
Reply

Marsh Posté le 12-09-2016 à 08:00:35    

Merci pour les infos
Je ne connaissais pas du tout sqlite3. Ca m'a l'air petit et très pratique pour ce que je dois faire.
Du coup je vais me plonger dedans.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed