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 :

tester qu'une liste est "sorted"


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Par défaut tester qu'une liste est "sorted"
    Bonjour,

    je bloque sur une bêtise, qui révèle surement une incompréhension...
    Je veux tester qu'une liste est triée, dans l'ordre croissant
    après l'avoir créée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x1 = pylab.arange(0,1,0.1)
    , j'aurais bien vu quelquechose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(sorted(x1) != x1): ...
    mais quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    print sorted(x1)
    print x1
    print sorted(x1) != x1
    j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [0.0, 0.10000000000000001, 0.20000000000000001, 0.30000000000000004, 0.40000000000000002, 0.5, 0.60000000000000009, 0.70000000000000007, 0.80000000000000004, 0.90000000000000002]
    [ 0.   0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9]
    [False False False False False False False False False False]
    Et alors, pourquoi la fonction sorted() se permet-elle de modifier le contenu de ma liste ?
    Aussi, pourquoi 0.10000000000000001 == 0.1 ?
    ducoup,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(all(sorted(x1) != x1)):...
    semble faire le boulot, mais je doute!

    merci pour vos eclaircicements !

  2. #2
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Bonjour,
    alors tout d abord les listes, dictionnaires et classes python sont modifiable n importe ou d ou cet facheuse tendance a toujours retourner de nouveaux objets.
    Mais du moins la version de Python (<=2.6) que j utilise retourne une nouvelle liste et ne modifie pas l originale.
    Bref tu devrais creer une liste temporaire pour ton test.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    l = [1, 65, 3, -45, 99, -48]
    tmp = list[l]
    print sorted(tmp)==l
    Tu pourrais si tu le veux en faire une fonction.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    No comprendo !
    Excuse moi alefriedx, mais je ne comprends même pas ton exemple...
    Moi ça me donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> x1 = [ 1,5,96,7,5,2,32,6 ] # les valeurs n'ont pas grande importance
    >>> print sorted( x1 )
    [1, 2, 5, 5, 6, 7, 32, 96]
    >>> print x1
    [1, 5, 96, 7, 5, 2, 32, 6]
    >>> print sorted( x1 ) != x1
    True
    --> je n'obtiens pas une liste de True/False comme toi...
    Es-tu sûr que les affichages que tu as postés sont ceux des commandes du dessus ?

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Eh non, sorted modifie l'ordre mais pas les données elles-mêmes. Dans le raisonnement, il manque quelque chose: quand on veut saisir un nombre flottant, on tape des touches, et Python doit stocker le nombre en mémoire sous une forme normalisée binaire. Et il n'est pas toujours possible de stocker exactement le nombre saisi. Et quand on demande l'affichage, Python reprend, non pas le nombre saisi, mais le nombre stocké sous forme binaire.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    x1 = [0.0, 0.10000000000000001, 0.20000000000000001, 0.30000000000000004, 0.40000000000000002, 0.5, 0.60000000000000009, 0.70000000000000007, 0.80000000000000004, 0.90000000000000002]
    print x1
    x2 = sorted(x1)
    print x2
    print x2 == x1
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9]
    [0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9]
    True
    Tyrtamos

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonsoir,

    je ne pense pas que la question portait sur le formatage des nombres flotants, mais sur le fait que l'opérateur de comparaison renvoie 1 ou plusieurs valeurs.

    Captain'Flam, toi tu utilises des listes et l'op utilse des tableaux numpy. C'est pour cela que vous n'avez pas le même type de résultat.

    alefriedx

    je te conseille d'utiliser les fonctions numpy avec les tableaux numpy plutôt que les built-in Python.

    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import numpy as np
    a = np.arange(0., 5., 1.)
    b = np.sort(a)
    if np.all(a==b):
      print "ok"

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Comme le dit uther78, autant éviter de passer par un tri de tableau (bizarrement, son code posté utilise tout de même sorted mais le lien qu'il donne contient le bon code).

    Voici une autre possibilité, courte et élégante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    all(x<=y for x,y in zip(x1,x1[1:]))
    Le défaut est qu'on copie la séquence (sans le premier élément) en écrivant x1[1:]. Cela signifie aussi que le conteneur doit supporter le slicing.
    Pour éviter cela, on peut utiliser un itérateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    it = iter(x1)
    next(it) # drop first element
    all(x<=y for x,y in zip(x1,it))
    ou bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from itertools import islice
    all(x<=y for x,y in zip(l,islice(l,1,None)))
    (En Python 2.x, considérer aussi l'usage de itertools.izip au lieu de zip; en Python 3.x, zip est l'ancien izip, de la même façon que range est l'ancien xrange).

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    Voici une fonction permettant d'éviter de passer par le tri d'un tableau qui peut s'avérer couteux si ce dernier contient de nombreux éléments :

    Check if a list of numbers is sorted

    A+

Discussions similaires

  1. [WD17] Tester si une liste est initialisée ou pas
    Par droliprane dans le forum WinDev
    Réponses: 10
    Dernier message: 10/12/2013, 17h45
  2. Réponses: 4
    Dernier message: 17/12/2007, 14h46
  3. Tester si une liste (SELECT) est ouverte ?
    Par Hibou57 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/07/2007, 18h59

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