Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1345 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  boucle de dico et liste

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

boucle de dico et liste

n°2287647
iguanic
Posté le 09-09-2016 à 15:21:24  profilanswer
 

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
mood
Publicité
Posté le 09-09-2016 à 15:21:24  profilanswer
 

n°2287689
bistouille
Posté le 10-09-2016 à 18:29:43  profilanswer
 

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.
n°2287691
iguanic
Posté le 10-09-2016 à 21:12:05  profilanswer
 

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}]
 
 
 

n°2287701
bistouille
Posté le 11-09-2016 à 02:23:23  profilanswer
 

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.
n°2287723
iguanic
Posté le 11-09-2016 à 15:34:00  profilanswer
 

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é.

n°2287729
bistouille
Posté le 11-09-2016 à 19:06:29  profilanswer
 

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.
n°2287746
iguanic
Posté le 12-09-2016 à 08:00:35  profilanswer
 

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.
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  boucle de dico et liste

 

Sujets relatifs
exploiter une liste dans un retour Jsonparcours d'une liste en lisp
langage c et liste chainee[BATCH] récupérer la liste des compilateurs
[Excel 2k7] Liste deroulante ne fonctionne plusExistence de répertoires d'après une liste
La fameuse boucle "For Each... Next"[RSOLU] [bash] while avec if/elif/fi qui tourne en boucle
[Prolog] : ajouter un nombre à la bonne place dans une liste de nb 
Plus de sujets relatifs à : boucle de dico et liste


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR