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

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

A voir également:

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

bonjour,

le code fonctionne bien, il te donne le résultat attendu?

0

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)
0
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

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

0