Trier un dictionnaire
Fermé
arthurlfbv
-
18 janv. 2023 à 17:29
mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 - 18 janv. 2023 à 18:02
mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 - 18 janv. 2023 à 18:02
A voir également:
- Trier un dictionnaire
- Télécharger dictionnaire larousse pdf gratuit - Télécharger - Dictionnaires & Langues
- Excel trier par ordre croissant chiffre - Guide
- Attaque par dictionnaire - Guide
- Télécharger dictionnaire médical larousse gratuit pdf - Télécharger - Dictionnaires & Langues
- Télécharger dictionnaire français gratuit pdf - Télécharger - Bureautique
3 réponses
yg_be
Messages postés
23331
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
Ambassadeur
1 551
18 janv. 2023 à 17:48
18 janv. 2023 à 17:48
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)
mamiemando
Messages postés
33363
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
16 novembre 2024
7 801
18 janv. 2023 à 18:02
18 janv. 2023 à 18:02
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