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 :

Trouver séquence incrémentale de n nombres


Sujet :

Python

  1. #21
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    transfert des données entre la feuille de calcul et le python.
    Quelle est ta méthode pour faire cela ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  2. #22
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    voici le code pour prendre les données sur la feuille , faire le traitement pour une suite de n éléments et afficher les résultats sur la feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    def calculSuite(n):
        #ODOC.NamedRanges.getByName("ListeResultats").getReferredCells().clearContents(31)
        plage = ODOC.NamedRanges.getByName("ListeNombres").getReferredCells()
        # on récupere la liste des nombres en une seule fois
        valeurs = plage.getDataArray()
        maListe = []
        for valeur in valeurs:
            maListe += find_incremental_sequence(list(valeur), n)
        result = count_and_order_tuples(maListe)
        listres=[]
        for tpl, count in result:
            listres.append([str(tpl),count])
        sheet = ODOC.CurrentController.ActiveSheet
        cursor = sheet.createCursorByRange(sheet.getCellByPosition(10 + (n-3)*2,1))
        cursor.collapseToSize( len(listres[0]) , len(listres) )
        cursor.setDataArray(listres)
    Nom : LoPythonAffSuites.gif
Affichages : 62
Taille : 252,3 Ko

    Dans le traitement en plus de la fonction dont il est question dans cette discussion, on met tous les tuples dans une liste et on classe par nombre de fois qu'un tuple est présent( count_and_order_tuples) et on va mettre dans 2 colonnes de la feuille, les tuples sous forme de chaine et dans la colonne à côté le nombre de fois qu'il est présent.
    En fait les fonctions getDataArray() et setDataArray() ne sont pas si lentes que cela car pour 4000 lignes de 10 nombres le temps d'exécution est de 60 ms par appel. C'est plutôt le temps d'affichage dans la feuille qui prend du temps ( quelques secondes).
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #23
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Mieux la liste comprehension

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maListe = [find_incremental_sequence(list(valeur), n) for valeur in valeurs]
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listres = [[str(tpl), count] for tpl, count in result]
    C'est plutôt le temps d'affichage dans la feuille qui prend du temps ( quelques secondes).
    Pour cela on pourrait limiter le nombre d'opérations d'écriture si possible. Plutôt que ligne par ligne, tu gardes en mémoire les données à écrire et tu écris le tout en une seule opération.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #24
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Pour cela on pourrait limiter le nombre d'opérations d'écriture si possible. Plutôt que ligne par ligne, tu gardes en mémoire les données à écrire et tu écris le tout en une seule opération.
    des écritures il n'y en pas beaucoup un setDataArray pour une série de n nombres donc 3 au total pour 3 séries et finalement si on regarde le gif animé on voit que le traitement total pour 3 types de série est rapide quand même
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #25
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    plus classique du coup, aucune idée des perfs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    def foo(l,n):
    	n -= 1
            ln = len(l)-n
    	e = 1
    	idx = 0
    	out = []
     
    	while e<ln:
    		if l[e-1]==l[e]-1:
    			idx += 1
    			if idx == n:
    				out.append((*l[e-n:e+1],))
    				idx = 0
    				e+=1
    		else:
    			idx = 0
    		e+=1
    	return out

  6. #26
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Hello,
    Citation Envoyé par josmiley Voir le message
    plus classique du coup, aucune idée des perfs:
    ben cela m'a l'air d'être la plus performante, voici ce que j'obtiens comme temps :
    0.03163999999992484
    0.02775870000004943
    0.022576200000003155
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #27
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Sinon je peux comprendre que les oneliners sont toujours impressionnants
    Oui c'est ça. J'ai bien vu certains soucis (surtout la récursivité) mais c'est le onliner qui est magnifique

    Citation Envoyé par jurassic pork Voir le message
    La fonction de Sve@r est certainement plus rapide car il n'y a pas la conversion en entier à faire.
    Oui enfin j'ai pas non plus inventé l'eau tiède. Je me suis contenté d'écrire l'algorithme "glouton" correspondant (en fait j'ai vu le besoin initial comme rechercher les sous-chaines d'une chaine).

    Citation Envoyé par jurassic pork Voir le message
    fred ton essai semble pas mal voilà ce que j'obtiens en performance :

    Mieux que la fonction de Sve@r
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #28
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Hello,

    Oui c'est ça. J'ai bien vu certains soucis (surtout la récursivité) mais c'est le onliner qui est magnifique
    C'est vrai qu'il faut se triturer l'esprit surtout en pensant récursivité à créer ce genre de oneliner (pas onliner ).

    J'ai beaucoup de difficulté à créer ce genre de ligne, je manque de pratiques... il faut pour cela que je trouve le oneliner assez intuitif, sinon je ne cherche pas à le créer naturellement.

    Concernant l'efficacité, il y a mieux, voir le dernier code de @josmiley
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #29
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Citation Envoyé par fred1599 Voir le message

    J'ai beaucoup de difficulté à créer ce genre de ligne, je manque de pratiques... il faut pour cela que je trouve le oneliner assez intuitif, sinon je ne cherche pas à le créer naturellement.
    une bonne façon de s'initier pour moi c'est tenter l 'apprentissage d' haskell, sans aller jusqu'au bout ça m'a permis une approche différente de la prog.

  10. #30
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Oui pour la partie récursivité haskell a un intérêt, mais pour les oneliners complexes, pas sûr que s'appuyer sur un langage fonctionnel ai un intérêt.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Toutes versions] Trouver dans une liste de nombre la première occurence libre
    Par possible924 dans le forum VBA Access
    Réponses: 3
    Dernier message: 05/09/2014, 14h02
  2. Trouver la dernière ligne avec nombre positif
    Par andrea0 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/02/2011, 20h32
  3. Trouver un encadrement d'un nombre dans une liste
    Par boulette85 dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 15/07/2008, 13h33
  4. Réponses: 6
    Dernier message: 13/12/2007, 14h27
  5. Prog trouver un nombre !!!
    Par wareq dans le forum C
    Réponses: 9
    Dernier message: 04/10/2005, 08h46

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