Trier un dictionnaire
Bonjour,
Je souhaiterai trier un dictionnaire avec la clé occurence qui felle est une valeur de chaque clé d'une des maisons d'harry potter. Le but serai que le dictionnaire soit trié en fonction de l'occurrence.
Merci d'avance
import csv import operator from math import sqrt with open("Characters.csv", mode='r', encoding='utf-8') as f: reader = csv.DictReader(f, delimiter=';') characters_tab = [{key: value for key, value in element.items()} for element in reader] with open("Caracteristiques_des_persos.csv", mode='r', encoding='utf-8') as f: reader = csv.DictReader(f, delimiter=';') characteristics_tab = [{key: value for key, value in element.items()} for element in reader] poudlard_characters = [] for poudlard_character in characteristics_tab: for kaggle_character in characters_tab: if poudlard_character['Name'] == kaggle_character['Name']: poudlard_character.update(kaggle_character) poudlard_characters.append(poudlard_character) joueur_character = [{'Courage': 3, 'Ambition': 4, 'Intelligence': 8, 'Good': 8}] dico_k_plus_proche = {} for joueur_character_1 in poudlard_characters: dico_k_plus_proche['Distance'] = sqrt((int(joueur_character[0]['Courage']) - int(joueur_character_1['Courage'])) ** 2 + (int(joueur_character[0]['Ambition']) - int(joueur_character_1['Ambition'])) ** 2 + (int(joueur_character[0]['Intelligence']) - int(joueur_character_1['Intelligence'])) ** 2 + (int(joueur_character[0]['Good']) - int(joueur_character_1['Good'])) ** 2) joueur_character_1.update(dico_k_plus_proche) poudlard_characters.sort(key=operator.itemgetter('Distance')) dico_trie = {} occurrence_maison = 0 compteur= 0 value = 0 for element in poudlard_characters[0:5]: if element['House'] in dico_trie: value += element['Distance'] dico_trie[element['House']].update({'Occurrence': compteur+1,'Distance cumulé' : value}) else: value = element['Distance'] dico_trie[element['House']] = {'Occurrence': compteur, 'Distance cumulé' : value} print(dico_trie) dico_trie = sorted(dico_trie.items(), key=lambda item: item[0][2]) print(dico_trie)
Windows / Chrome 109.0.0.0
- Trier un dictionnaire
- Trier un tableau excel - Guide
- Télécharger dictionnaire larousse pdf gratuit - Télécharger - Dictionnaires & Langues
- Télécharger dictionnaire médical larousse gratuit pdf - Télécharger - Dictionnaires & Langues
- Dictionnaire synonyme gratuit - Télécharger - Études & Formations
- Logiciel pour trier les photos automatiquement - Guide
3 réponses
bonjour,
le code fonctionne bien, il te donne le résultat attendu?
Je voudrais que mon dico tri les maisons dans l'ordre de leur occurrence, dans l'exemple ci dessous ce n'est pas le cas. (j'ai change le script le précèdent exemple était mauvais).
import csv import operator from math import sqrt with open("Characters.csv", mode='r', encoding='utf-8') as f: reader = csv.DictReader(f, delimiter=';') characters_tab = [{key: value for key, value in element.items()} for element in reader] with open("Caracteristiques_des_persos.csv", mode='r', encoding='utf-8') as f: reader = csv.DictReader(f, delimiter=';') characteristics_tab = [{key: value for key, value in element.items()} for element in reader] poudlard_characters = [] for poudlard_character in characteristics_tab: for kaggle_character in characters_tab: if poudlard_character['Name'] == kaggle_character['Name']: poudlard_character.update(kaggle_character) poudlard_characters.append(poudlard_character) joueur_character = [{'Courage': 3, 'Ambition': 8, 'Intelligence': 6, 'Good': 3}] dico_k_plus_proche = {} for joueur_character_1 in poudlard_characters: dico_k_plus_proche['Distance'] = sqrt((int(joueur_character[0]['Courage']) - int(joueur_character_1['Courage'])) ** 2 + (int(joueur_character[0]['Ambition']) - int(joueur_character_1['Ambition'])) ** 2 + (int(joueur_character[0]['Intelligence']) - int(joueur_character_1['Intelligence'])) ** 2 + (int(joueur_character[0]['Good']) - int(joueur_character_1['Good'])) ** 2) joueur_character_1.update(dico_k_plus_proche) poudlard_characters.sort(key=operator.itemgetter('Distance')) dico_trie = {} occurrence_maison = 0 compteur= 0 value = 0 for element in poudlard_characters[0:5]: if element['House'] in dico_trie: value += element['Distance'] dico_trie[element['House']].update({'Occurrence': compteur+1,'Distance cumulé' : value}) else: value = element['Distance'] dico_trie[element['House']] = {'Occurrence': compteur, 'Distance cumulé' : value} print(dico_trie) dico_trie = sorted(dico_trie.items(), key=lambda item: item[0][2]) print(dico_trie)
Bonjour,
Le code en lui-même dépend de fichiers csv, ce serait pas mal de les partager (au moins des csv minimaux) pour pouvoir reproduire le code.
Un dictionnaire n'est pas trié en python. Il n'y a pas de notion de comparateur de clé comme en C++.
Tu peux par contre :
- soit générer une liste triée comme tu le souhaites en utilisant la fonction sorted (comme tu as fait),
- soit utiliser un collections.OrderedDict (voir ce lien)
- soit utiliser une pandas.dataFrame et sa méthode sort_values (mais pandas dans le cas présent est complètement overkill)
- soit créer ta propre classe de dictionnaire
Bonne chance