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. #1
    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 Trouver séquence incrémentale de n nombres
    Hello,
    le titre est peut-être pas très explicite alors voici des explications.
    Soit une liste de 10 nombres.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    l1=[1,2,3,4,5,6,7,8,9,10]
    # ou
    l2 = [1,2,3,8,9,10,11,5,6,7]
    trouver une fonction qui renvoie une liste de tuples constitués de n nombres qui se suivent à partir d'une liste de nombres. Cette liste et n étant fournis en paramètres de la fonction.
    Exemple pour l1 avec n = 3 :
    [(1,2,3),(4,5,6),(7,8,9)]
    Exemple pour l2 avec n = 3 :
    [(1,2,3),(8,9,10),(5,6,7)]
    j'espère que c'est assez clair.
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  2. #2
    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
    Bonjour
    Citation Envoyé par jurassic pork Voir le message
    j'espère que c'est assez clair.
    avec les exemples oui ça va.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def genere(l, *, n=1):
    	return tuple(l[i:i+n] for i in range(0, len(l) - len(l)%n, n))
     
    l=tuple(range(1, 11))
    print(genere(l, n=3))
    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]

  3. #3
    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
    Merci bien Sve@r cela semble fonctionner pour 3 ( j'ai remplacé ton tuple du return par un list car je voulais une liste) mais j'ai un problème par exemple avec n=2 avec cette liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l1=[1,2,3,4,18,19,20,21,22,100]
    j'obtiens pour n=2 :
    [(1, 2), (3, 4), (18, 19), (20, 21), (22, 100)]
    le dernier tuple n'est pas bon.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  4. #4
    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 jurassic pork Voir le message
    le dernier tuple n'est pas bon.
    Pour obtenir une liste au lieu d'un tuple c'est un détail (moi je pars toujours du minimum nécessaire et ensuite, si besoin, on peut alors caster le retour de la fonction) mais je ne comprends pas pourquoi le dernier tuple n'est pas bon.
    Ta liste initiale l1=[1,2,3,4,18,19,20,21,22,100] contient 10 éléments. Pour n=2 j'ai compris que ça devait retourner 5 tuples de 2 éléments(1) ce qui est bel et bien le cas. Qu'ai-je donc raté ???

    (1) en fait là où j'ai eu une difficulté c'est quand la liste de départ n'était pas multiple de n. Dans mon premier essai ça renvoyait [(1, 2, 3), (4, 5, 6), (7, 8, 9), (10,)] d'où cet empirique len(l) - len(l)%n pour arrêter à "multiple de n inférieur ou égal à len(l)"...
    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]

  5. #5
    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 Sve@r Voir le message
    Ta liste initiale l1=[1,2,3,4,18,19,20,21,22,100] contient 10 éléments. Pour n=2 j'ai compris que ça devait retourner 5 tuples de 2 éléments(1) ce qui est bel et bien le cas.
    ben non en fait, 100 n'est pas 22+1 alors il ne faut prendre le tuple et en fait la fonction ne fonctionne pas (même pour 3 mes exemples sont mal choisis essayer avec [8,9,10,40,11,12,13,14,15,16] qui doit renvoyer [(8,9,10),(11,12,13),(14,15,16)] )
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    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
    Salut,

    Si on cherche un peu sur Internet pour voir ce qui existe déjà on tombe sur ce genre d'algorithmes...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    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 jurassic pork Voir le message
    ben non en fait, 100 n'est pas 22+1 alors il ne faut prendre le tuple et en fait la fonction ne fonctionne pas (même pour 3 mes exemples sont mal choisis essayer avec [8,9,10,40,11,12,13,14,15,16] qui doit renvoyer [(8,9,10),(11,12,13),(14,15,16)] )
    Ok. Le 40 fait un peu plus bien chier le monde quoi. Mais j'y suis arrivé.
    Tout d'abord (diviser pour régner) une fonction qui part d'un point de la liste et qui, si elle trouve n éléments à suivre, renvoie ces n éléments sous forme de tuple. Sinon elle renvoie None.

    Ensuite une boucle pour trouver, à chaque fois, le point de départ suivant selon la dernière valeur mémorisée. Et à partir de ce point elle regarde si elle peut récupérer n éléments suivants.
    Code python : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #!/usr/bin/env python3
    # coding: utf-8
     
    def genere(l, *, n=1):
    	# Déjà la création du tuple
    	def make(i):
    		data=(l[i],)
    		for j in l[i+1:i+n]:
    			if j != data[-1] + 1: return None
    			data=data + (j,)
    		# for
    		return data if len(data) == n else None
    	# make()
     
    	# Traitement de la liste
    	ret=list()
    	i=0
    	while i < len(l):
    		# Si élément en cours pas suivant dernier élément mémorisé
    		# Ou si pas de génération
    		# Alors on passe à l'élément suivant
    		if (ret and l[i] != ret[-1][-1] + 1) or not (work:=make(i)):
    			i+=1
    			continue
    		# if
     
    		# On rajoute le tuple créé
    		ret.append(work)
    		i+=n
    	# while
    	return ret
    # genere()
     
    l=[8, 9, 10, 40, 11, 12, 13, 14, 15, 16, 18, 19, 20]
    print(genere(l, n=3))
    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. #8
    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 wiztricks Voir le message
    Salut,

    Si on cherche un peu sur Internet pour voir ce qui existe déjà on tombe sur ce genre d'algorithmes...

    - W
    ben non j'ai cherché sur internet mais ce que je recherche exactement on ne le trouve pas ( suite de n éléments qui se suivent) et si tu as trouvé met nous le code

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    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
    Désolé Sve@r cela ne fonctionne toujours pas :
    avec cette liste en entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [1,2,3,4,18,19,20,21,22,100]]
    pour n=3
    j'obtiens [(1, 2, 3)] alors que j'attends [(1, 2, 3),(18,19,20)]
    et pour n=2
    j'obtiens [(1, 2), (3, 4)] alors que j'attends [(1, 2), (3, 4), (18,19), (20,21)]
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut
    EDIT: grillé

    bonjour
    Citation Envoyé par Sve@r Voir le message
    Mais j'y suis arrivé.
    Oui, mais comme la demande n'est pas encore claire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    l=[50, 51, 52, 8, 9, 10, 40, 11, 12, 13, 53, 54, 55, 14, 15, 16, 18, 19, 20]
    print(genere(l, n=3))
    Ne retourne que les valeurs > 49 ... Les tuples doivent aussi se suivre ou que les nombres dans un tuple ???
    $moi= ( !== ) ? : ;

  11. #11
    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 jurassic pork Voir le message
    Désolé Sve@r cela ne fonctionne toujours pas :
    avec cette liste en entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [1,2,3,4,18,19,20,21,22,100]]
    pour n=3
    j'obtiens [(1, 2, 3)] alors que j'attends [(1, 2, 3),(18,19,20)]
    et pour n=2
    j'obtiens [(1, 2), (3, 4)] alors que j'attends [(1, 2), (3, 4), (18,19), (20,21)]
    Ok, c'était dans l'exemple précédent le "11" qui suivait le "10" (si on oblitère ce "40" parasite) qui m'a laissé croire qu'il fallait que la suite continue à la fin de la suite précédente.

    Mais ça c'est facile à corriger. Suffit de supprimer le (ret and l[i] != ret[-1][-1] + 1) qui servait à gérer la continuation. Si pas besoin de continuation alors pas besoin de cette partie.
    Le test devient alors simplement if not (work:=make(i)) qui checke juste la génération d'une suite. Et avec tes exemples ça donne bien le résultat demandé.

    Citation Envoyé par papajoker Voir le message
    EDIT: grillé
    Ah ben oui, 3h c'est une éternité dans ce forum

    Citation Envoyé par papajoker Voir le message
    Les tuples doivent aussi se suivre ou que les nombres dans un tuple ???
    Oui voilà, c'est bel et bien la question. Mais bon avec le nouveau test, ton exemple donne [(50, 51, 52), (8, 9, 10), (11, 12, 13), (53, 54, 55), (14, 15, 16), (18, 19, 20)] ce qui me semble (oui maintenant je joue la prudence ) correct...
    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]

  12. #12
    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
    Bravo Sve@r cela semble OK maintenant ! Entre temps j'avais demandé au démoniaque ChatGPT qui m'a sorti une fonction (que j'ai du légèrement modifier) qui donne les mêmes résultats que la tienne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def find_incremental_sequence(lst, n):
        lseq = []
        i=0
        while i < len(lst) - n + 1:
            if all(lst[i + j] == lst[i] + j for j in range(n)):
                lseq.append(tuple(lst[i:i + n]))
                i +=n-1
            i +=1
        return lseq
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  13. #13
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    l = [1,2,3,8,9,10,11,5,6,7]
     
    foo = lambda l,n: l and (l[:n]==[*range(l[0],l[0]+n)] and [(*l[:n],)] + foo(l[n:],n) or foo(l[1:],n))
     
    print(foo(l,3))

  14. #14
    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 josmiley Voir le message
    foo = lambda l,n: l and (l[:n]==list(range(l[0],l[0]+n)) and [(*l[:n],)] + foo(l[n:],n) or foo(l[1:],n))
    Impressionnant
    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]

  15. #15
    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,
    Effectivement c'est très impressionnant, c'est d'un niveau Gourou . Cela donne les mêmes résultats que les deux fonctions précédentes.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  16. #16
    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,

    Ma proposition,

    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
    from itertools import pairwise
     
    def find_incremental_sequences(lst, n):
        result = []
        i = 0
     
        while i <= len(lst) - n:
            subsequence = lst[i:i + n]
            if all(y - x == 1 for x, y in pairwise(subsequence)):
                result.append(tuple(subsequence))
                i += n - 1
            i += 1
     
        return result
     
    assert find_incremental_sequences([8,9,10,40,11,12,13,14,15,16], n=3) == [(8,9,10),(11,12,13),(14,15,16)]
    assert find_incremental_sequences([1,2,3,4,18,19,20,21,22,100], n=2) == [(1, 2), (3, 4), (18, 19), (20, 21)]
    pairwise a été introduit dans le module itertools depuis la version python 3.10

    Sve@r,

    Impressionnant
    T'es sûr

    1. Récursivité (souvent lent en python et limité)
    2. Lisibilité
    3. Copies nombreuses de listes (slice)


    Sinon je peux comprendre que les oneliners sont toujours impressionnants mais passent très rarement les revues de code, surtout sur cette longueur de ligne.
    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)

  17. #17
    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
    Sinon je peux comprendre que les oneliners sont toujours impressionnants mais passent très rarement les revues de code, surtout sur cette longueur de ligne.
    C'est clair , les perfs ne sont jamais au rdv avec ce genre d'exercice , mais je trouve cela tellement amusant

  18. #18
    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,
    Désolé fred1599 et merci de t'être penché sur le problème mais je ne vous ai pas tout dit. La fonction doit être utilisée dans une macro python LibreOffice donc avec un python 3.8 et on ne peut pas employer pairwise. Une autre chose que je ne vous ai pas dite c'est que la liste en entrée est une liste de float car récupérer dans feuille du tableur calc c'est pour cela que dans la fonction de chatgpt j'ai rajouté un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lstint = list(map(int, lst))
    je dois faire aussi cette conversion dans la fonction de josmiley. Par contre dans la fonction à Sve@r ça passe avec une liste de float en entrée.
    J' ai fait un test de performance dans le cas réel avec 4000 lignes de 10 nombres pour trouver des suites de 3,4 et 5 nombres. Voici les résultats :
    ChatGpt:
    0.1264035000003787
    0.1163778000000093
    0.10706149999987247
    Sve@r:
    0.07142360000034387
    0.0756098000001657
    0.08020909999959258
    josmiley:
    0.1208133000000089
    0.11995089999982156
    0.12660740000137594
    La fonction de Sve@r est certainement plus rapide car il n'y a pas la conversion en entier à faire. Il y a peut-être moyen de s'en passer en adaptant le code dans les deux fonctions qui l'utilisent.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  19. #19
    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,

    @jurassic_pork,

    oui la version est importante, mais nous ne savions pas non plus que tu avais un besoin d'efficacité (4000 lignes).

    Autre essai,

    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
    19
    20
    21
    def find_incremental_sequences(lst, n):
        results = []
        i = 0
     
        while i <= len(lst) - n:
            is_incremental = True
            for j in range(n - 1):
                if lst[i + j + 1] - lst[i + j] != 1:
                    is_incremental = False
                    break
     
            if is_incremental:
                results.append(tuple(lst[i:i + n]))
                i += n
            else:
                i += 1
     
        return results
     
    assert find_incremental_sequences([8,9,10,40,11,12,13,14,15,16], n=3) == [(8,9,10),(11,12,13),(14,15,16)]
    assert find_incremental_sequences([1,2,3,4,18,19,20,21,22,100], n=2) == [(1, 2), (3, 4), (18, 19), (20, 21)]
    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)

  20. #20
    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
    fred ton essai semble pas mal voilà ce que j'obtiens en performance :
    0.06364769999709097
    0.061388799997075694
    0.05734239999947022
    Mieux que la fonction de Sve@r


    et à noter que finalement la fonction de chatGpt n'a pas besoin de la conversion en entier en on obtient alors comme performance :
    0.10574530000303639
    0.10048109999843291
    0.09056110000165063
    mais tout ceci n'est qu'anecdotique car la différence de performance entre des temps de l'ordre de 100ms et de 60ms ne se verra pas car le temps total du traitement dans LibreOffice sera surtout celui du transfert des données entre la feuille de calcul et le python.

    Merci à tous pour votre participation
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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