# \[python\] nb d'éléments dans une liste avec une condition

**URL:** <https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 12:31 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184 "2016-02-21T00:31:59Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 12:31 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/1 "2016-02-21T00:31:59Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 12:32 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/2 "2016-02-21T00:32:00Z")

</div>

Sinon je viens de trouver ca

`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:](https://www.debian-fr.org/uploads/default/original/1X/7733f25880e690d75c39aa9a7c7798ed563873e1.gif "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.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 12:32 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/3 "2016-02-21T00:32:02Z")

</div>

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).

---

<div class="post-metadata">

**Author:** ![sinozis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/85f322/32.png) [@sinozis](https://www.debian-fr.org/u/sinozis)\
**Post date:** [Février 21, 2016, 12:32 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/4 "2016-02-21T00:32:09Z")

</div>

il y a aussi la fonction filter :

```auto
>>> 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 :

`>>> 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]
`

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 12:32 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/5 "2016-02-21T00:32:12Z")

</div>

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:[quote=“MisterFreez”] (c’est plus court oui, mais plus logique je dirais pas).[/quote]  
ce qui est plus logique est le résultat de u\>2 & u\<10

---

<div class="post-metadata">

**Author:** ![sinozis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/85f322/32.png) [@sinozis](https://www.debian-fr.org/u/sinozis)\
**Post date:** [Février 21, 2016, 12:32 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/6 "2016-02-21T00:32:31Z")

</div>

[quote=“limax”]edit2 c’est quoi le mieux (ou le plus rapide)  
[f(x) for x in u] ou map(f,u)[/quote]  
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.

---

<div class="post-metadata">

**Author:** ![sinozis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/85f322/32.png) [@sinozis](https://www.debian-fr.org/u/sinozis)\
**Post date:** [Février 21, 2016, 12:32 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/7 "2016-02-21T00:32:36Z")

</div>

j’ai fais des tests de vitesse avec le module [timeit](http://python.developpez.com/faq/?page=Optimisation#TempsExecution)  
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))[/code]

[quote=“Python\_2.6.6\_WinVista (au boulot)”]\>\>\>  
1.71375950016[/quote]

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))[/code]

[quote=“Python\_2.6.6\_WinVista (au boulot)”]\>\>\>  
1.72096153282[/quote]

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.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 12:33 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/8 "2016-02-21T00:33:18Z")

</div>

Les comprehension list me semblent plus gourmandes (je crois qu’elles consomment plus de mémoire aussi).

---

<div class="post-metadata">

**Author:** ![Dixippe](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/5f8ce5/32.png) [@Dixippe](https://www.debian-fr.org/u/Dixippe)\
**Post date:** [Février 21, 2016, 12:33 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/9 "2016-02-21T00:33:54Z")

</div>

On peut faire aussi:

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

---

<div class="post-metadata">

**Author:** ![sinozis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/85f322/32.png) [@sinozis](https://www.debian-fr.org/u/sinozis)\
**Post date:** [Février 21, 2016, 12:33 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/10 "2016-02-21T00:33:55Z")

</div>

non ca ne fonctionne pas comme ça !  
le but était de compter les éléments de la liste compris entre 2 et 10

---

<div class="post-metadata">

**Author:** ![Dixippe](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/5f8ce5/32.png) [@Dixippe](https://www.debian-fr.org/u/Dixippe)\
**Post date:** [Février 21, 2016, 12:33 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/11 "2016-02-21T00:33:57Z")

</div>

Non mais là il n’y a que l’idée, il faut développer.

par exemple:

```auto
>>> 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…”  
😒

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 12:33 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/12 "2016-02-21T00:33:57Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 12:33 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/13 "2016-02-21T00:33:59Z")

</div>

@Dixippe \> Ta solution n’est pas parfaite car elle pose deux hypothèses fortes :  
[ul]  
[li]on utilise une liste d’entiers trié[/li]  
[li]la condition est simple[/li][/ul]

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.

---

<div class="post-metadata">

**Author:** ![Dixippe](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/5f8ce5/32.png) [@Dixippe](https://www.debian-fr.org/u/Dixippe)\
**Post date:** [Février 21, 2016, 12:34 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/14 "2016-02-21T00:34:09Z")

</div>

@MisterFreez\> bien évidemment, c’est une solution pour le jeu.

Qui voudrait se priver des listes compréhensions par ce que allergique au ‹&nbsp;for&nbsp;›? ![:doh:](https://www.debian-fr.org/uploads/default/original/1X/78536cf08b5cbccb06a10e44ddb8da50bfc1554d.gif "Doh!")

La ‹&nbsp;list comprehension&nbsp;› est un des super aspects de python.

A noter que la ‹&nbsp;list comprehension&nbsp;› remplace map et filter «&nbsp;vouées à disparaître et qui ne doivent plus être utilisées&nbsp;»\*.

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 12:34 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/15 "2016-02-21T00:34:09Z")

</div>

> [@Dixippe](#):
>
> A noter que la ‹&nbsp;list comprehension&nbsp;› remplace map et filter «&nbsp;vouées à disparaître et qui ne doivent plus être utilisées&nbsp;»\*.

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

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 12:59 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/16 "2016-02-21T00:59:13Z")

</div>

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 🙂  
[scipy.org/Tentative\_NumPy\_Tu … 97586a4fc5](http://www.scipy.org/Tentative_NumPy_Tutorial#head-4c1d53fe504adc97baf27b65513b4b97586a4fc5)

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 1:00 UTC](https://www.debian-fr.org/t/python-nb-delements-dans-une-liste-avec-une-condition/30184/17 "2016-02-21T01:00:45Z")

</div>

oui merci je regarde plus attentivement la doc.

Sinon je me suis bien fait aux listes comprehension
