Quelle est ta méthode pour faire cela ?Citation:
transfert des données entre la feuille de calcul et le python.
Version imprimable
Quelle est ta méthode pour faire cela ?Citation:
transfert des données entre la feuille de calcul et le python.
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 :
Pièce jointe 650340Code:
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)
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).
Mieux la liste comprehension
etCode:maListe = [find_incremental_sequence(list(valeur), n) for valeur in valeurs]
Code:listres = [[str(tpl), count] for tpl, count in result]
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.Citation:
C'est plutôt le temps d'affichage dans la feuille qui prend du temps ( quelques secondes).
plus classique du coup, aucune idée des perfs:
Code:
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
Oui c'est ça. J'ai bien vu certains soucis (surtout la récursivité) mais c'est le onliner qui est magnifique 8-)
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). :mrgreen:
:pleure::pleure::triste:
Hello,
C'est vrai qu'il faut se triturer l'esprit surtout en pensant récursivité à créer ce genre de oneliner (pas onliner ;) ).Citation:
Oui c'est ça. J'ai bien vu certains soucis (surtout la récursivité) mais c'est le onliner qui est magnifique
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 :D
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.
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.