Forum Programmation.python Tri multi-clés et multi-sens

Posté par  (site web personnel) .
Étiquettes : aucune
0
30
juin
2008
Bonsoir tout le monde,

il y a quelques temps j'avais rédigé ma propre bibliothèque de tri car je trouvais les autres un peu trop compliquées pour ce que je voulais en faire. Ma bibliothèque m'a rendu de fiers services, sauf que désormais elle peine un peu car j'en ai besoin pour de super gros fichiers, et elle n'a pas été concu pour (en fait, le support gros fichier était prévu, mais je n'ai jamais terminé, car j'me suis dis que ca ne me servirait jamais)

Désormais quand je vois l'ignoble code de ma librairie, je me dis que ca ne sert plus à grand chose de la maintenir, donc je me tourne vers vous pour m'aiguiller sur ce que je recherche :)

L'idée est simple, actuellement si je veux trier un fichier tri.txt contenant :
AAAA0001ZZZZ
AAAA0002ZZZZ
BBBB0001ZZZZ
AAAA0001ZZZX

Avec comme critères 1ère colonne croissante, 2eme colonne décroissante, 3eme colonne croissante, je fais :
>>> import mksort
>>> pouet = mksort.FlatFile("tri.txt")
>>> pouet.addkey(0,4)
>>> pouet.addkey(4,8,mksort.DESC)
>>> pouet.addkey(8,12)
>>> pouet.sort()
>>> for val in pouet: print val[:-1]
...
AAAA0002ZZZZ
AAAA0001ZZZX
AAAA0001ZZZZ
BBBB0001ZZZZ
>>> pouet.write() #on écrase le fichier original, ou en précisant en paramètre le nom du nouveau fichier

Avec un fichier csv, c'est un peu pareil, sauf que cette fois ci ce n'est plus des plages de caractères, mais des numéros de colonne :

>>> import mksort
>>> plouf = mksort.CsvFile("tri.txt",";")
>>> plouf.addkey(1)
>>> plouf.addkey(2,mksort.DESC)
>>> plouf.addkey(3)
>>> plouf.sort()
>>> for val in plouf: print val[:-1]
...
AAAA;0002;ZZZZ
AAAA;0001;ZZZX
AAAA;0001;ZZZZ
BBBB;0001;ZZZZ


Bref, ca marche aussi avec des données directement issues d'un tableau (à ce moment là j'utilise les classes FlatTab ou CsvTab), pour ce que j'en faisais c'était nickel.

Voilà, désormais mon beau joujou se vautre sur de gros fichiers, et c'est trop relou de modifier mon bidule là tout de suite maintenant (je tri mon tableau en n passes, avec n = nombre de clés définies, donc en mode split/sort/merge, mon algo foireux ne tient pas du tout la route)

Si quelqu'un a des solutions faciles à implémenter voir toutes faites, je suis preneur.

Au passage, je donne à la communauté ma merveilleuse librairie, qui convient parfaitement pour les petites besognes (et même de taille honorable, pour peu que l'on ne soit pas à la dixième de seconde près ;)

http://fuck.the.world.free.fr/mksort/


Merci !
  • # msort ?

    Posté par  . Évalué à 2.

    • [^] # Re: msort ?

      Posté par  (site web personnel) . Évalué à 1.

      J'aurai du me relire et constater que c'était pas clair ce que je demandais !

      Je voulais en effet des solutions *en python*, afin de les mélanger à d'autres bouts de code en python.

      Sinon, ton programme a l'air très sympa (en dehors du fait qu'il ne réponde pas précisément à mes besoins), il a vraiment l'air de tout gérer :)
      • [^] # Re: msort ?

        Posté par  (site web personnel) . Évalué à 1.

        bon ok, j'ai rien dit, msort a l'air d'être écrit en python :)

        je reformule donc mes besoins : une librairie python sympa à utiliser pour faire du tri multi-clés simplement

        j'vais y arriver :+)
  • # hop

    Posté par  . Évalué à 2.

    Vite fait, si tes données peuvent être transformées en une liste de tuples : http://paste.stgraber.org/9698
    Sans trop réfléchir, je pense que c'est du n^2 log(n)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.