Programmation Python listes
Résolu/Fermé
HofmanC
Messages postés
4
Date d'inscription
vendredi 7 août 2020
Statut
Membre
Dernière intervention
7 août 2020
-
7 août 2020 à 10:17
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 - 7 août 2020 à 22:41
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 - 7 août 2020 à 22:41
A voir également:
- Programmation Python listes
- Citizen code python avis - Accueil - Outils
- Application de programmation - Guide
- Python retour à la ligne dans le code - Forum Python
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
2 réponses
yg_be
Messages postés
23405
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 décembre 2024
Ambassadeur
1 557
7 août 2020 à 10:24
7 août 2020 à 10:24
bonjour, qu'as-tu essayé?
HofmanC
Messages postés
4
Date d'inscription
vendredi 7 août 2020
Statut
Membre
Dernière intervention
7 août 2020
7 août 2020 à 12:40
7 août 2020 à 12:40
Bonjour,
J'ai finalement, trouvé une solution qui utilise un compromis entre les deux méthodes en une seule boucle for !
J'utilise l'histogramme. Mais je ne sélectionne que les valeurs des index se répétant le plus.
Voici le code :
Résultat :
Ainsi même si un doublons est présent avec un triplé, les valeurs du doublons ne seront pas prises en compte.
Merci encore pour l'aide apportée !
Bien Cordialement
Hofman
J'ai finalement, trouvé une solution qui utilise un compromis entre les deux méthodes en une seule boucle for !
J'utilise l'histogramme. Mais je ne sélectionne que les valeurs des index se répétant le plus.
Voici le code :
index_list = [1, 1, 1, 3, 5, 4, 7, 9, 9, 0]
mfccs_list = [0.640495, 0.4822588, 0.6523488, 0.74474275, 0.5423001, 0.85711163, 0.724612, 0.5099624, 0.9696293, 0.97258127]
# Histogramme des index et de leur répétition
histogram = dict((n, index_list.count(n)) for n in set(index_list))
print("Histogramme : ","\n", histogram)
#print ("\nItems de l'histogramme : ","\n", histogram.items())
print ("\nNbre d'apparation des index : ","\n", histogram.values())
print ("\nMaximum d'apparitions d'un même index : ", max(histogram.values()))
result_mcfccs = []
for m, n in enumerate(index_list):
if index_list.count(n) == max (histogram.values()):
result_mcfccs.append(mfccs_list[m])
print("\nListe des Mfccs des index apparaissants le plus :","\n", result_mcfccs)
result2 = max(result_mcfccs)
print("\nRésultat final :", result2)
Résultat :
runfile('C:/Users/c.hofman.BORDEAUX/Desktop/Codes python/04 Son/Genre Classification/Liste.py', wdir='C:/Users/c.hofman.BORDEAUX/Desktop/Codes python/04 Son/Genre Classification')
Histogramme :
{0: 1, 1: 3, 3: 1, 4: 1, 5: 1, 7: 1, 9: 2}
Nbre d'apparation des index :
dict_values([1, 3, 1, 1, 1, 1, 2])
Maximum d'apparitions d'un même index : 3
Liste des Mfccs des index apparaissants le plus :
[0.640495, 0.4822588, 0.6523488]
Résultat final : 0.6523488
Ainsi même si un doublons est présent avec un triplé, les valeurs du doublons ne seront pas prises en compte.
Merci encore pour l'aide apportée !
Bien Cordialement
Hofman
quent217
Messages postés
421
Date d'inscription
vendredi 25 septembre 2015
Statut
Membre
Dernière intervention
1 mars 2024
347
7 août 2020 à 15:36
7 août 2020 à 15:36
Bonjour,
si je peux me permettre, votre code fonctionne mais il n'est pas du tout efficace. Tant que les listes d'entrée sont petites ça ne change pas grand chose, mais si vous utilisez des grandes listes, la différence se fera sentir.
Pourtant il y a quelques éléments simples que vous pouvez corriger.
Déjà vous calculez le nombre d'occurences de chaque éléments à la ligne 5, et vous refaites le même calcul à la ligne 15 plutôt que de réutiliser les résulats. Vous pourriez faire
Ensuite vous recalculez le max de l'histogramme à chaque passage dans la boucle à la ligne 15 alors que vous pourriez stocker cette information dans un variable avant la boucle étant donnée qu'elle reste constante.
Vous pourriez aussi optimiser la boucle car vous itérez sur la liste qui contient beaucoup de doublons. Il serait plus rapide d'itérer sur le dictionnaire (l'histogramme) qui contient les mêmes informations mais sans les doublons.
Voilà les choses que vous pouvez corriger très simplement.
Mais de manière générale, votre algorithme a une complexité quadratique alors que vous pourriez le faire avec une complexité linéaire. C'est le cas notamment de la ligne 5 car la méthode count va elle même itérer sur toute la liste alors que vous pourriez parcourir une seule fois la liste et mettant à jour le dictionnaire pour chaque élément.
Bonne journée
si je peux me permettre, votre code fonctionne mais il n'est pas du tout efficace. Tant que les listes d'entrée sont petites ça ne change pas grand chose, mais si vous utilisez des grandes listes, la différence se fera sentir.
Pourtant il y a quelques éléments simples que vous pouvez corriger.
Déjà vous calculez le nombre d'occurences de chaque éléments à la ligne 5, et vous refaites le même calcul à la ligne 15 plutôt que de réutiliser les résulats. Vous pourriez faire
if histogram[n] == max (histogram.values()):
Ensuite vous recalculez le max de l'histogramme à chaque passage dans la boucle à la ligne 15 alors que vous pourriez stocker cette information dans un variable avant la boucle étant donnée qu'elle reste constante.
Vous pourriez aussi optimiser la boucle car vous itérez sur la liste qui contient beaucoup de doublons. Il serait plus rapide d'itérer sur le dictionnaire (l'histogramme) qui contient les mêmes informations mais sans les doublons.
Voilà les choses que vous pouvez corriger très simplement.
Mais de manière générale, votre algorithme a une complexité quadratique alors que vous pourriez le faire avec une complexité linéaire. C'est le cas notamment de la ligne 5 car la méthode count va elle même itérer sur toute la liste alors que vous pourriez parcourir une seule fois la liste et mettant à jour le dictionnaire pour chaque élément.
Bonne journée
HofmanC
Messages postés
4
Date d'inscription
vendredi 7 août 2020
Statut
Membre
Dernière intervention
7 août 2020
7 août 2020 à 15:37
7 août 2020 à 15:37
Petit "update" de mon résultat final avec deux méthodes qui fonctionnent, la méthode 2, avec la liste étant, je trouve, la meilleure des deux !
Merci encore
Cordialement
Hofman
#%% Méthode avec des histogrammes :
from collections import Counter
index_list = [1, 1, 1, 2, 2, 4, 7, 9, 9, 0]
mfccs_list = [0.640495, 0.4822588, 0.6523488, 0.74474275, 0.5423001, 0.85711163, 0.724612, 0.5099624, 0.9696293, 0.97258127]
# # Histogramme des index et de leur répétition
# histogram = dict((n, index_list.count(n)) for n in set(index_list))
# print("Histogramme : ","\n", histogram)
# print ("\nItems de l'histogramme : ","\n", histogram.items())
# print ("\nNbre d'apparation des index : ","\n", histogram.values())
# print ("\nMaximum d'apparitions d'un même index : ", max(histogram.values()))
# result_mcfccs = []
# for m, n in enumerate(index_list):
# if index_list.count(n) == max (histogram.values()):
# result_mcfccs.append(mfccs_list[m])
# print("\nListe des Mfccs des index apparaissants le plus :","\n", result_mcfccs)
# result2 = max(result_mcfccs)
# print("\nRésultat final :", result2)
# extract=tuple(k for (k, v) in histogram.items() if v == max(histogram.values()))
# print(extract)
# indices = list(map(lambda x: x[0], Counter(index_list).most_common()))
# counts = list(map(lambda x: x[1], Counter(index_list).most_common()))
# max_indices = [indices[i] for i, x in enumerate(counts) if x == max(counts)]
# print(max_indices)
#%% Méthode avec une liste :
result_mcfccs = []
indices = list(map(lambda x: x[0], Counter(index_list).most_common()))
counts = list(map(lambda x: x[1], Counter(index_list).most_common()))
print("\nIndices présents dans la liste : ", indices)
print("\nNombre d'apparition des indices : ", counts)
max_indices = [indices[i] for i, x in enumerate(counts) if x == max(counts)]
for idx, id in enumerate(index_list):
if id in max_indices:
result_mcfccs.append(mfccs_list[idx])
result = max(result_mcfccs)
print("\n Indice se répétant le plus : ", max_indices)
print("\n Valeur des indices se répétant le plus : ","\n",result_mcfccs)
print("\n Valeur maximale de l'indice se répétant le plus : ",result)
indice = mfccs_list.index(result)
print("\nEmplacement de la valeur dans la lsite :",indice)
print("\nRésultat final : ", index_list.pop(indice))
Merci encore
Cordialement
Hofman
yg_be
Messages postés
23405
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 décembre 2024
1 557
>
quent217
Messages postés
421
Date d'inscription
vendredi 25 septembre 2015
Statut
Membre
Dernière intervention
1 mars 2024
7 août 2020 à 15:48
7 août 2020 à 15:48
de plus, au lieu de créer la liste result_mcfccs pour en calculer ensuite le maximum, il est plus efficace de calculer le maximum dans la boucle, au lieu de créer la liste, qui ne sert à rien d'autre:
maxhv=max (histogram.values())
maxhv=max (histogram.values())
result2=float('-inf') for m,n in enumerate(index_list): if index_list.count(n) == maxhv: if mfccs_list[m]>result2: result2=mfccs_list[m]
quent217
Messages postés
421
Date d'inscription
vendredi 25 septembre 2015
Statut
Membre
Dernière intervention
1 mars 2024
347
>
yg_be
Messages postés
23405
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 décembre 2024
7 août 2020 à 16:19
7 août 2020 à 16:19
Oui effectivement, et on pourrait même simplifier encore plus en utilisant la fonction max de python :)
maxhv = max(histogram.values()) result2 = max(mfccs_list[key] for key, value in histogram.items() if value == maxhv)
yg_be
Messages postés
23405
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 décembre 2024
1 557
>
quent217
Messages postés
421
Date d'inscription
vendredi 25 septembre 2015
Statut
Membre
Dernière intervention
1 mars 2024
Modifié le 7 août 2020 à 18:27
Modifié le 7 août 2020 à 18:27
je ne pense pas, en tous cas cela ne donne pas le résultat attendu.
7 août 2020 à 11:02
J'ai essayé deux méthodes :
Méthode 1 :
Utiliser un histogramme. C'est la méthode la plus efficace et rapide que j'ai trouvé pour le moment mais malheureusement, elle ne fonctionne pas dans tous les cas et je n'arrive pas à savoir ce qui bloque. Voici le code :
Le code est ici censé nous rendre la valeur la plus élevée entre les valeurs des deux 1 et des deux 4 soit 0.74. Mais le résultat est le suivant :
Deuxième méthode :
Méthode plus longue et plus "brouillon" ;)
Je passe par une boucle for et je liste les cas possibles. Comme je veux sélectionner seulement les groupes les plus nombreux, s'il y a un doublons et un triplé, je ne veux que la valeur la plus élevée du triplé, je retire donc de la liste les valeurs du doublons avec un if.
Malheureusement, cela fonctionne seulement si les doublons se trouve avant les triplés dans la liste de départ.
Voici mon code :
Modifié le 7 août 2020 à 12:06
j'ai examiné l'histogramme.
il me semble que tu te prends les pieds dans tes données et dans le nom des variables.
la première liste ne contient pas des index à utiliser dans la seconde.
7 août 2020 à 12:10
avant d'écrire du code, prends le temps de te demander comment tu ferais cela à la main, avec une feuille et un crayon. quand tu as trouvé une bonne méthode, tu peux commencer à la programmer.