CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Python] Créer sa propre version de tri

MrGreez94
MrGreez94
Niveau 10
26 mai 2016 à 14:21:17

Bonjour

Je suis actuellement en train de chercher une solution pour créer ma propre méthode de tri car celle par défaut arrive presque à faire le travail à une exception prêt (J'ai mis le tag python car c'est le langage que j'utilise mais c'est plus un problème d'algo qu'autre chose :hap:).

En gros j'aimerais bien trier une liste de versions (sens croissant ou décroissant peu importe comment) afin d'en déterminer le maximum.

Le format des versions que je peux rencontrer ressemble à:

["1.32STD31","1.32STD6","1.33STD29","1.33STD3"]

Cette liste est issue du tri par défaut de python et comme vous le voyez, le dernier nombre qui correspond à numéro de release est interprété chiffre par chiffre et non comme un nombre dans sa totalité. On retrouve alors que '31' < '6' car c'est d'abord le 6 et le 3 qui sont comparés alors que '06' < '31'.

J'ai commencé un truc mais je vois pas comment aboutir à quelque chose facilement. Le tout est de les trier sans modifier les string (j'aligne tout au même nombre de digits et le problème est réglé sinon :hap: )

Quelqu'un aurait-il une piste ? :hap:

MrGreez94
MrGreez94
Niveau 10
26 mai 2016 à 15:56:24

Bon au bout d' 1h30 j'ai trouvé une solution qui marche mais dont je suis pas super satisfait

Je décompose tout en tuple

[(1, 33, 'STD', 50),
(1, 33, 'STD', 29), 
(1, 32, 'STD', 31), 
(1, 33, 'STD', 51), 
(1, 33, 'STD', 49),
(1, 33, 'STD', 3), 
(1, 33, 'STD', 46), 
(1, 32, 'STD', 6), 
(1, 33, 'STD', 41)]

Et là la fonction de tri par défaut de python s'y retrouve, je remets tout bout à bout une fois les tuples triées :(

MrGreez94
MrGreez94
Niveau 10
27 mai 2016 à 01:54:57

Je ne peux pas me permettre de changer la string car cela doit matcher par la suite avec le nom original à travers plusieurs collection, enfin c'est un peu complexe. En gros je suis obligé de formater toutes les strings ou alors je trouve une méthode qui fait un tri spécialisé

89ron
89ron
Niveau 10
27 mai 2016 à 04:23:04

Bah pourquoi tu créer pas des objets ?

Où tu auras :
- Ton string standard (inchangée)
- Une entree formater avec laquelle tu l'utilisera pour le tri et l'identification de ton objet.

AlphaCygni
AlphaCygni
Niveau 10
27 mai 2016 à 09:00:16

Je connais pas la syntaxe python mais tu dois sans doute avoir moyen de passer une fonction de comparaison custom à ta fonction de tri. Comme ça tu peux dire que ta fonction qui sert à comparer tes string, consiste à les changer en tuples puis comparer les tuples.
Ça fait un peu plus propre que "je change tout en tuples, je trie, je reviens en string".

lamino94
lamino94
Niveau 8
28 mai 2016 à 17:46:44

Tu dois d'abord faire une fonction de comparaison:

def compare(s1,s2):
    """
    Fonction de comparaison
    """
    nombre1=int(s1[7:])
    nombre2=int(s2[7:])
    if nombre1>nombre2:
        return 1
    elif nombre1<nombre2:
        return -1
    else:
        return 0

Ensuite tu peux juste utiliser la méthode de comparaison de Python "sort()", en passant en paramètre ta fonction de comparaison, tu dois cependant faire appelle au module functools:

>>> from functools import cmp_to_key

>>> L=["1.32STD31","1.32STD6","1.33STD29","1.33STD3"]

>>> L.sort(key=cmp_to_key(compare))

>>> L
['1.33STD3', '1.32STD6', '1.33STD29', '1.32STD31']
[[sticker:p/1kkn]]
Blaff4
Blaff4
Niveau 10
29 mai 2016 à 19:24:48

Comme le conseille AlphaCygni, il faut faire une fonction de comparaison personnalisée, que tu peux ensuite passer comme argument à la fonction `sort()` via le paramètre optionnel `key`. Un peu comme a fait lamino94, mais sans utiliser `cmp_to_key` qui ne sert pas véritablement à ça (elle sert pour traduire du vieux code Python 2 vers Python 3).

L'idée, c'est de faire une fonction qui, pour chaque string, retourne un tuple de 3 valeurs (numéros de ta version). Lors du tri, Python va commencer par comparer entre deux string le premier élément de ce tuple (le numéro de version majeur, donc), si le numéro est le même il passe au second élément du tuple pour affiner, puis au troisième si nécessaire, etc.
De cette manière ta liste est triée correctement.

Je ferai personnellement quelque chose comme ça :

import re

regex_version = re.compile(r'(\d+)\.(\d+)STD(\d+)')

def custom_sort(string):
    groups = regex_version.match(string).groups()
    return tuple(map(int, groups))

lst.sort(key=custom_sort)

Ça a l'avantage d'être flexible (tu peux facilement adapter et modifier la regex) tout en permettant de lever une erreur si un de tes strings n'est pas au bon format (plutôt qu'une valeur bizarre et incorrecte ne soit pas détectée, et puisse être source de bugs par la suite). :

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment