Forum debian-fr.org

Rechercher:

* Connexion   * M’enregistrer

* FAQ    * Rechercher





Poster un nouveau sujet Répondre au sujet  [ 17 messages ] 
Auteur Message
MessagePosté: 12 Jan 2011 14:47 
Hors ligne
Vraiment, particulièrement bavard(e)!
Avatar de l’utilisateur

Inscription: 25 Avr 2006 09:30
Messages: 1778
Localisation: grenoble
bonjour

J'ai une liste par exemple

u=range(15)
Je souhaite compter le nombre d'éléments de u tel que 2<=u[i]<=10

existe il un moyen d'avoir directement le résultat sans faire une boucle et passer en revu tout les éléments de la liste.
J'ai bien trouvé pour compter le nombre d'éléments égale à 2 mais pas supérieur à 2.

merci

_________________
I love vim


Haut
 Profil  
 
MessagePosté: 12 Jan 2011 16:25 
Hors ligne
Vraiment, particulièrement bavard(e)!
Avatar de l’utilisateur

Inscription: 25 Avr 2006 09:30
Messages: 1778
Localisation: grenoble
Sinon je viens de trouver ca

Code:
u=range(15)
[i for i in u if i>=2 and i<=10] # pour obtenir la liste réalisant la condition
len([i for i in u if i>=2 and i<=10])  # pour avoir le nombre d'éléments


:snooty: avec R je fais sum(u>=2 & u<=10) et je trouve ceci plus logique.

Si vous avez une autre méthode je suis preneur

Heureusement que j'aime bien les monthy python ca motive.

_________________
I love vim


Haut
 Profil  
 
MessagePosté: 12 Jan 2011 18:17 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 18 Juil 2007 16:57
Messages: 8602
Je ne connais pas mieux personnellement. Seul perl et langages fonctionnel sont plus agréable je trouve (avec des filtres). Pour sum(u>=2 & u<=10) c'est vraiment une question de goût (c'est plus court oui, mais plus logique je dirais pas).

_________________
Je suis Pitta, cartésien, irritable, irritant et névrosé (de plus je fais de l'entrisme pour zsh), si l'un de mes messages vous insupporte essayez d'y voir de l'ironie ou de ne pas en tenir compte. Bonne journée et gardez le sourire. :)


Haut
 Profil  
 
MessagePosté: 13 Jan 2011 10:15 
Hors ligne
Très bavard(e)!
Avatar de l’utilisateur

Inscription: 10 Mai 2009 21:53
Messages: 857
Localisation: Moselle est
il y a aussi la fonction filter :
Code:
>>> u= range(15)
>>> def plage(x):return x>=2 and x<=10
>>> print filter(plage,u)
[2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> len(filter(plage,u))
9

edit
on peut aussi faire ça avec un lambda en plus pour eviter la fonction au début :
Code:
>>> len(filter(lambda x: x>=2 and x<=10,u))
9
print filter(lambda x: x>=2 and x<=10,u)
[2, 3, 4, 5, 6, 7, 8, 9, 10]

_________________
PC Portable i3 4Go ram | debian stable | Openbox + tint2 + nitrogen + thunar + ... + etc
Code:
    .--.
   |o_o |
   |:_/ |
  //   \ \
 (|     | )
/'\_   _/`\
\___)=(___/


Haut
 Profil  
 
MessagePosté: 13 Jan 2011 15:09 
Hors ligne
Vraiment, particulièrement bavard(e)!
Avatar de l’utilisateur

Inscription: 25 Avr 2006 09:30
Messages: 1778
Localisation: grenoble
Merci

Je pense cependant garder la syntaxe [f(x) for x in liste if x>=2 and x<=10]

edit: tu m'as fait cependant découvrir la fonction plage et après lecture la fonction map (j'en avais besoin)
def f(x):return x**2
map(f,u)

edit2 c'est quoi le mieux (ou le plus rapide)
[f(x) for x in u ] ou map(f,u)

edit3:
MisterFreez a écrit:
(c'est plus court oui, mais plus logique je dirais pas).

ce qui est plus logique est le résultat de u>2 & u<10

_________________
I love vim


Haut
 Profil  
 
MessagePosté: 13 Jan 2011 19:44 
Hors ligne
Très bavard(e)!
Avatar de l’utilisateur

Inscription: 10 Mai 2009 21:53
Messages: 857
Localisation: Moselle est
limax a écrit:
edit2 c'est quoi le mieux (ou le plus rapide)
[f(x) for x in u ] ou map(f,u)

j'en sais rien je ne suis qu'un débutant en Programmation.
il faudrait faire un test en lançant un timer sur une très grosse liste pour comparer les deux syntaxes.

_________________
PC Portable i3 4Go ram | debian stable | Openbox + tint2 + nitrogen + thunar + ... + etc
Code:
    .--.
   |o_o |
   |:_/ |
  //   \ \
 (|     | )
/'\_   _/`\
\___)=(___/


Haut
 Profil  
 
MessagePosté: 14 Jan 2011 06:37 
Hors ligne
Très bavard(e)!
Avatar de l’utilisateur

Inscription: 10 Mai 2009 21:53
Messages: 857
Localisation: Moselle est
j'ai fais des tests de vitesse avec le module timeit
script pour map
Code:
#!/usr/bin/env python
# -*- coding:ISO-8859-1 -*-

import timeit
def f(x):return x**2
test1 = timeit.Timer("map(f,u)", "from __main__ import f;u = range(100000)")
print(test1.timeit(10))

Python_2.6.6_WinVista (au boulot) a écrit:
>>>
1.71375950016


script pour for :
Code:
#!/usr/bin/env python
# -*- coding:ISO-8859-1 -*-

import timeit
def f(x):return x**2
test1 = timeit.Timer("[f(x) for x in u ]", "from __main__ import f;u = range(100000)")
print(test1.timeit(10))

Python_2.6.6_WinVista (au boulot) a écrit:
>>>
1.72096153282


les résultat sont les mêmes, perso je préfère la fonction map, qui est plus lisible, ensuite ce n’est qu’une question de gout.

_________________
PC Portable i3 4Go ram | debian stable | Openbox + tint2 + nitrogen + thunar + ... + etc
Code:
    .--.
   |o_o |
   |:_/ |
  //   \ \
 (|     | )
/'\_   _/`\
\___)=(___/


Haut
 Profil  
 
MessagePosté: 14 Jan 2011 14:24 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 18 Juil 2007 16:57
Messages: 8602
Les comprehension list me semblent plus gourmandes (je crois qu'elles consomment plus de mémoire aussi).

_________________
Je suis Pitta, cartésien, irritable, irritant et névrosé (de plus je fais de l'entrisme pour zsh), si l'un de mes messages vous insupporte essayez d'y voir de l'ironie ou de ne pas en tenir compte. Bonne journée et gardez le sourire. :)


Haut
 Profil  
 
MessagePosté: 15 Jan 2011 19:47 
Hors ligne
Grand posteur
Avatar de l’utilisateur

Inscription: 19 Sep 2009 16:30
Messages: 169
On peut faire aussi:

Code:
>>> u = range(15)
>>> u
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> len(u[2:11])
9
>>>


Haut
 Profil  
 
MessagePosté: 15 Jan 2011 22:02 
Hors ligne
Très bavard(e)!
Avatar de l’utilisateur

Inscription: 10 Mai 2009 21:53
Messages: 857
Localisation: Moselle est
non ca ne fonctionne pas comme ça !
le but était de compter les éléments de la liste compris entre 2 et 10

_________________
PC Portable i3 4Go ram | debian stable | Openbox + tint2 + nitrogen + thunar + ... + etc
Code:
    .--.
   |o_o |
   |:_/ |
  //   \ \
 (|     | )
/'\_   _/`\
\___)=(___/


Haut
 Profil  
 
MessagePosté: 16 Jan 2011 11:05 
Hors ligne
Grand posteur
Avatar de l’utilisateur

Inscription: 19 Sep 2009 16:30
Messages: 169
Non mais là il n'y a que l'idée, il faut développer.

par exemple:

Code:
>>> u = sample(xrange(50), 20)
>>> u
[25, 0, 9, 26, 13, 2, 14, 43, 45, 24, 3, 36, 5, 1, 37, 42, 48, 44, 15, 30]
>>> u.append(2)
>>> u.append(11)
>>> u.sort()
>>> u
[0, 1, 2, 2, 3, 5, 9, 11, 13, 14, 15, 24, 25, 26, 30, 36, 37, 42, 43, 44, 45, 48]
>>> start = u.index(2)
>>> end = u.index(11)
>>> len(u[start:end])-1
4
>>>


il y a bien 4 chiffres entre 2 et 10 (2<=u[i]<=10) dans la liste u première.
solution à la question:
"existe t-il un moyen d'avoir directement le résultat sans faire une boucle..."
:roll:


Haut
 Profil  
 
MessagePosté: 16 Jan 2011 11:16 
Hors ligne
Vraiment, particulièrement bavard(e)!
Avatar de l’utilisateur

Inscription: 25 Avr 2006 09:30
Messages: 1778
Localisation: grenoble
bonjour

Perso je trouve ca tordu

[f(x) for x in liste if x>=2 and x<=10] est quand même plus simple et plus logique.

_________________
I love vim


Haut
 Profil  
 
MessagePosté: 16 Jan 2011 13:55 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 18 Juil 2007 16:57
Messages: 8602
@Dixippe > Ta solution n'est pas parfaite car elle pose deux hypothèses fortes :
  • on utilise une liste d'entiers trié
  • la condition est simple

Si tu veux dans une liste de nombre à virgule flotante trouver tout les nombres qui sont des entiers ta solutions ne pourrait être utilisée. Si l'ordre dans la liste est importante, ta solution n'est pas acceptable non plus. L'utilisation de map ou des lists comprehensions est extrèmement générique.

_________________
Je suis Pitta, cartésien, irritable, irritant et névrosé (de plus je fais de l'entrisme pour zsh), si l'un de mes messages vous insupporte essayez d'y voir de l'ironie ou de ne pas en tenir compte. Bonne journée et gardez le sourire. :)


Haut
 Profil  
 
MessagePosté: 16 Jan 2011 18:48 
Hors ligne
Grand posteur
Avatar de l’utilisateur

Inscription: 19 Sep 2009 16:30
Messages: 169
@MisterFreez> bien évidemment, c'est une solution pour le jeu.

Qui voudrait se priver des listes compréhensions par ce que allergique au 'for'? :doh:

La 'list comprehension' est un des super aspects de python.

A noter que la 'list comprehension' remplace map et filter "vouées à disparaître et qui ne doivent plus être utilisées"*.


Haut
 Profil  
 
MessagePosté: 16 Jan 2011 18:58 
Hors ligne
Vraiment, particulièrement bavard(e)!
Avatar de l’utilisateur

Inscription: 25 Avr 2006 09:30
Messages: 1778
Localisation: grenoble
Dixippe a écrit:
A noter que la 'list comprehension' remplace map et filter "vouées à disparaître et qui ne doivent plus être utilisées"*.

ok, j'adopterai donc de préférence les listes comprehensions.

_________________
I love vim


Haut
 Profil  
 
MessagePosté: 24 Mar 2011 16:45 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 18 Juil 2007 16:57
Messages: 8602
limax, j'ai eu une idée ! Tu peux utiliser numpy. Avec tu peux faire les opération dont tu parle et dont tu es famillier avec R. Ca n'est pas bien compliqué à utiliser non plus :)
http://www.scipy.org/Tentative_NumPy_Tu ... 97586a4fc5

_________________
Je suis Pitta, cartésien, irritable, irritant et névrosé (de plus je fais de l'entrisme pour zsh), si l'un de mes messages vous insupporte essayez d'y voir de l'ironie ou de ne pas en tenir compte. Bonne journée et gardez le sourire. :)


Haut
 Profil  
 
MessagePosté: 29 Mar 2011 06:51 
Hors ligne
Vraiment, particulièrement bavard(e)!
Avatar de l’utilisateur

Inscription: 25 Avr 2006 09:30
Messages: 1778
Localisation: grenoble
oui merci je regarde plus attentivement la doc.

Sinon je me suis bien fait aux listes comprehension

_________________
I love vim


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 17 messages ] 

Index du forum » Divers » Programmation


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Aller à:  
Flux RSS Flux RSS Liste des flux Liste des flux
Powered by phpBB® Forum Software © phpBB Group
Traduction par: phpBB-fr.com
SEO
[ Time : 0.249s | 12 Queries | GZIP : Off ]