IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Equivalent sort -u unix en python


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Points : 37
    Points
    37
    Par défaut Equivalent sort -u unix en python
    Bjr,
    J'aimerais savoir si il existe un module, ou comment procéder pour avoir l'équivalent de la commande unix sort -u (supprime les doublons)
    En cherchant, les seuls réponses que j'ai trouvé sont de créer deux listes, d'en charger une avec les éléments de l'autre, un par un et de comparer à chaque fois ....

    Le problème c'est que je dois trier de gros fichier, tout ça en mémoire, c'est pas top !
    N'y a t'il pas une autre solution ?

    Personne n'a eu l'idée de coder un module qui 'émule' les commande unix, tels que sort (avec les options k R r etc, etc, comme unix), ou d'autres commandes utiles, surtout sur les traitements de fichier pas commode en python.

    Merci d'avance !

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Tu oeut essayer avec set(), ça enlève les doublon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >>> li = [1, 2, 5, 8, 4, 1, 8, 7, 5, 2]
    >>> liSort = set(sorted(li))
    >>> list(liSort)
    [1, 2, 4, 5, 7, 8]
    Après je sais pas comment ça se passe en mémoire.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Points : 37
    Points
    37
    Par défaut
    Je me doutais bien qu'il y avait une fonction pour le tri simple (sinon, cela m'aurait vraiment fait regretter le bash), mais pour le tri plus complexe ? Par exemple sur la troisième colonne de chaque éléments de la liste ?

    Ca se complique là ! Obligé de passer par un boucle et tester chaque éléments ? Il n'y a pas de fonction magique ?

    Thx.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour les doublons, on peut aussi supprimer de la liste les éléments qui se répètent, ce qui permet de ne pas avoir 2 listes en mémoire. L'instruction L.pop(i) supprime l'élément d'indice i. On parcourt alors la liste triée avec une boucle while. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    L = [1,2,2,3,4,5,5,5,5,6,6]
     
    i = 1
    while i<len(L):
        if L[i] == L[i-1]:
            L.pop(i)
        else:
            i += 1
     
    print L
    [1, 2, 3, 4, 5, 6]

    Pour le tri sous Python, les fonctions sort et sorted sont très puissantes et très adaptables.

    L.sort() trie sur place et sorted(L) donne une nouvelle liste triée.

    il y a 2 arguments optionnels à ces fonctions sous Python 2.6: cmp et key. Ces arguments sont des fonctions qui permettent de modifier les valeurs que la fonction de tri utilise dans ses comparaisons. En créant ses propres fonctions (c'est facile), on peut trier n'importe quoi, y compris, par exemple, une liste d'instance de classe par rapport à l'un des attributs, ou une liste de liste de chaines par rapport à une sous-chaine du 3ème élément. On peut aussi faire des tris selon l'alphabet français du dictionnaire ou selon l'ordre qu'on veut pour afficher des contenus de répertoires de disque (majuscule d'abord, puis tenir compte des caractères accentués, etc...).

    Prenons un petit exemple:

    On veut trier la liste suivante selon le 2ème élément de chaque sous-liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L = [[9,4,7],[6,1,4],[2,7,4],[0,9,8],[4,3,7],[2,1,0],[3,7,9]]
    On définit une nouvelle fonction de comparaison: les arguments v1 et v2 étant les éléments de la liste L, seront en fait ses sous-listes. Il est alors facile d'identifier le 2ème élément de chaque sous-liste (indice=1).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def comp(v1, v2):
        if v1[1]<v2[1]:
            return -1
        elif v1[1]>v2[1]:
            return 1
        else:
            return 0
    Et on trie comme d'habitude:

    Cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[6, 1, 4], [2, 1, 0], [4, 3, 7], [9, 4, 7], [2, 7, 4], [3, 7, 9], [0, 9, 8]]
    Ce qui est un résultat correct!

    A noter que les tris sont stables, c'est à dire ne modifient pas l'ordre des éléments dont les valeurs de tri sont égales. Ce qui permet d'appliquer successivement plusieurs tris.

    Je crois que Python 3.0 n'a plus que l'argument key, mais on peut faire la même chose avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def cle(v):
        return v[1]
     
    L.sort(key=cle)
    ce qui donne le même résultat trié.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Pourquoi ne pas appeler directement le Terminal dans le script Python...

  6. #6
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    pour le tri plus complexe ? Par exemple sur la troisième colonne de chaque éléments de la liste ?
    Tu peux aussi utiliser itemgetter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from operator import itemgetter
    L = [[9,4,7],[6,1,4],[2,7,4],[0,9,8],[4,3,7],[2,1,0],[3,7,9]]
    L.sort(key=itemgetter(2))
    print L
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[2, 1, 0], [6, 1, 4], [2, 7, 4], [9, 4, 7], [4, 3, 7], [0, 9, 8], [3, 7, 9]]
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Points : 37
    Points
    37
    Par défaut
    Bjr,
    Et ben ... Ca c'est de la réponse ! Et vite fait en plus.

    Merci à vous, c'est tout de suite plus clair ! (parce que la doc, c'est bien, mais en français ce serait mieux, je perds un temps fou à essayer de traduire et résultat des courses, j'ai tjrs pas compris )

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut idée à 3 sous
    Salut,
    Si les lignes du fichiers sont quelque peu structurées (des champs qui contiennent des libellés de texte ou un fichier CSV), vous pourriez vous amuser à charger le tout dans une table de base de donnée SQlite en
    mémoire.
    Comme il s'agit de texte, vous pourriez utiliser le numéro de la ligne lue comme clé primaire et un calcul md5 pour trouver les doublons.
    Ensuite vous avez accès à toutes les fonctions SQL pour trier dans tous les sens.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/06/2015, 12h28
  2. Equivalent des structures Matlab en Python
    Par tazgero dans le forum Calcul scientifique
    Réponses: 16
    Dernier message: 31/12/2010, 18h40
  3. Equivalent du perl @$var en python
    Par .:Spip:. dans le forum Général Python
    Réponses: 18
    Dernier message: 20/07/2010, 18h10
  4. equivalent UNIX de GetTickCount()
    Par JulienT dans le forum C
    Réponses: 1
    Dernier message: 16/12/2005, 12h29
  5. [bioinfo] Equivalence comd "source" Unix
    Par MSP dans le forum Bioinformatique
    Réponses: 5
    Dernier message: 26/08/2003, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo