Gérer les exceptions dans "une list comprehension"
11 réponses
jean-marc pouchoulon
Bonjour à tous,
je veux créer une liste via une autre liste. Mais j'ai des
enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe]
---------------------------------------------------------------------------
exceptions.IndexError Traceback (most
recent call last)
/home/bin/<ipython console>
IndexError: list index out of range
Je voudrais inclure la gestion de cette exception dans ma "list
comprehension" ( je sais faire avec un for et un try/except mais les
"list comprehensions" sont si jolies....)
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] --------------------------------------------------------------------------- exceptions.IndexError Traceback (most recent call last)
/home/bin/<ipython console>
IndexError: list index out of range
Je voudrais inclure la gestion de cette exception dans ma "list comprehension" ( je sais faire avec un for et un try/except mais les "list comprehensions" sont si jolies....)
Est ce possible ?
[l.split()[2] for l in maListe if len(l.split()) > 2] mais tu vas faire le split 2 fois
je ferais plutot
[t[2] for l in [l.split() for l in maListe] if len(t) > 2]
-+- JCD in Guide du linuxien pervers - "Bien configurer la lisibilité de fcolm"
jean-marc pouchoulon wrote:
Bonjour à tous,
je veux créer une liste via une autre liste. Mais j'ai des
enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe]
---------------------------------------------------------------------------
exceptions.IndexError Traceback (most
recent call last)
/home/bin/<ipython console>
IndexError: list index out of range
Je voudrais inclure la gestion de cette exception dans ma "list
comprehension" ( je sais faire avec un for et un try/except mais les
"list comprehensions" sont si jolies....)
Est ce possible ?
[l.split()[2] for l in maListe if len(l.split()) > 2]
mais tu vas faire le split 2 fois
je ferais plutot
[t[2] for l in [l.split() for l in maListe] if len(t) > 2]
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] --------------------------------------------------------------------------- exceptions.IndexError Traceback (most recent call last)
/home/bin/<ipython console>
IndexError: list index out of range
Je voudrais inclure la gestion de cette exception dans ma "list comprehension" ( je sais faire avec un for et un try/except mais les "list comprehensions" sont si jolies....)
Est ce possible ?
[l.split()[2] for l in maListe if len(l.split()) > 2] mais tu vas faire le split 2 fois
je ferais plutot
[t[2] for l in [l.split() for l in maListe] if len(t) > 2]
[t[2] for l in [l.split() for l in maListe] if len(t) > 2] ^
| ------------+
[t[2] for t in [l.split() for l in maListe] if len(t) > 2]
-- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in ''.split('@')])"
bruno at modulix
jean-marc pouchoulon wrote:
Bonjour à tous,
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] --------------------------------------------------------------------------- exceptions.IndexError Traceback (most recent call last)
/home/bin/<ipython console>
IndexError: list index out of range
Je voudrais inclure la gestion de cette exception dans ma "list comprehension" ( je sais faire avec un for et un try/except mais les "list comprehensions" sont si jolies....)
Est ce possible ?
Pas directement - "try" et "except" sont des instructions, et one ne peut mettre que des expressions dans une list comprehesion.
SI tu n'a pas de soucis de perfs, la solution d'Eric est probablement la plus simple et la plus efficace - hormis bien sûr faire une croix sur la list comprehesion.
Hint: le meilleurs choix au niveau perfs dépend du rapport enregistrement incohérents / enregistrements ok. Si ce rapport est faible, tu a plutôt intérêt à revenir à la bonne vieille boucle avec un try/except (un try/... est plus coûteux qu'un test, mais il n'a un coût que quand il y a *effectivement* une exception, alors que le coût du test est le même à chaque itération).
-- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in ''.split('@')])"
jean-marc pouchoulon wrote:
Bonjour à tous,
je veux créer une liste via une autre liste. Mais j'ai des
enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe]
---------------------------------------------------------------------------
exceptions.IndexError Traceback (most
recent call last)
/home/bin/<ipython console>
IndexError: list index out of range
Je voudrais inclure la gestion de cette exception dans ma "list
comprehension"
( je sais faire avec un for et un try/except mais les
"list comprehensions" sont si jolies....)
Est ce possible ?
Pas directement - "try" et "except" sont des instructions, et one ne
peut mettre que des expressions dans une list comprehesion.
SI tu n'a pas de soucis de perfs, la solution d'Eric est probablement la
plus simple et la plus efficace - hormis bien sûr faire une croix sur la
list comprehesion.
Hint: le meilleurs choix au niveau perfs dépend du rapport
enregistrement incohérents / enregistrements ok. Si ce rapport est
faible, tu a plutôt intérêt à revenir à la bonne vieille boucle avec un
try/except (un try/... est plus coûteux qu'un test, mais il n'a un coût
que quand il y a *effectivement* une exception, alors que le coût du
test est le même à chaque itération).
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb@xiludom.gro'.split('@')])"
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] --------------------------------------------------------------------------- exceptions.IndexError Traceback (most recent call last)
/home/bin/<ipython console>
IndexError: list index out of range
Je voudrais inclure la gestion de cette exception dans ma "list comprehension" ( je sais faire avec un for et un try/except mais les "list comprehensions" sont si jolies....)
Est ce possible ?
Pas directement - "try" et "except" sont des instructions, et one ne peut mettre que des expressions dans une list comprehesion.
SI tu n'a pas de soucis de perfs, la solution d'Eric est probablement la plus simple et la plus efficace - hormis bien sûr faire une croix sur la list comprehesion.
Hint: le meilleurs choix au niveau perfs dépend du rapport enregistrement incohérents / enregistrements ok. Si ce rapport est faible, tu a plutôt intérêt à revenir à la bonne vieille boucle avec un try/except (un try/... est plus coûteux qu'un test, mais il n'a un coût que quand il y a *effectivement* une exception, alors que le coût du test est le même à chaque itération).
-- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in ''.split('@')])"
Gerard Flanagan
jean-marc pouchoulon wrote:
Bonjour à tous,
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] ------------------------------------------------------------------------- -- exceptions.IndexError Traceback (most recent call last)
/home/bin/<ipython console>
IndexError: list index out of range
Je voudrais inclure la gestion de cette exception dans ma "list comprehension" ( je sais faire avec un for et un try/except mais les "list comprehensions" sont si jolies....)
Est ce possible ?
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
['c','c','c','c']
Gerard
jean-marc pouchoulon wrote:
Bonjour à tous,
je veux créer une liste via une autre liste. Mais j'ai des
enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe]
------------------------------------------------------------------------- --
exceptions.IndexError Traceback (most
recent call last)
/home/bin/<ipython console>
IndexError: list index out of range
Je voudrais inclure la gestion de cette exception dans ma "list
comprehension" ( je sais faire avec un for et un try/except mais les
"list comprehensions" sont si jolies....)
Est ce possible ?
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] ------------------------------------------------------------------------- -- exceptions.IndexError Traceback (most recent call last)
/home/bin/<ipython console>
IndexError: list index out of range
Je voudrais inclure la gestion de cette exception dans ma "list comprehension" ( je sais faire avec un for et un try/except mais les "list comprehensions" sont si jolies....)
Est ce possible ?
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
['c','c','c','c']
Gerard
Gerard Flanagan
Gerard Flanagan wrote:
jean-marc pouchoulon wrote:
Bonjour à tous,
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] ----------------------------------------------------------------------- ---- exceptions.IndexError Traceback (most recent call last)
[...]
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
['c','c','c','c']
ou (sans list comprehension) avec 'ifilter', 'map' et 'lambda' :
A = [ 'abc', 'ab', 'abc', 'a', 'abc' ]
from itertools import ifilter from operator import itemgetter
je veux créer une liste via une autre liste. Mais j'ai des
enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe]
----------------------------------------------------------------------- ----
exceptions.IndexError Traceback (most
recent call last)
[...]
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
['c','c','c','c']
ou (sans list comprehension) avec 'ifilter', 'map' et 'lambda' :
A = [ 'abc', 'ab', 'abc', 'a', 'abc' ]
from itertools import ifilter
from operator import itemgetter
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] ----------------------------------------------------------------------- ---- exceptions.IndexError Traceback (most recent call last)
[...]
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
['c','c','c','c']
ou (sans list comprehension) avec 'ifilter', 'map' et 'lambda' :
A = [ 'abc', 'ab', 'abc', 'a', 'abc' ]
from itertools import ifilter from operator import itemgetter
[t[2] for l in [l.split() for l in maListe] if len(t) > 2] ^
| ------------+
[t[2] for t in [l.split() for l in maListe] if len(t) > 2]
oui en effet merci.
Eric -- O : J'aimerais savoir si en plus d'être cocu, je suis con... BG : Si ce n'est pas par le cul que se font les cocons, c'est bien par le con que ce font les cocus. -+- in: Guide du Cabaliste Usenet - Bien configurer son cocon -+-
bruno at modulix wrote:
Eric Deveaud wrote:
(snip)
je ferais plutot
[t[2] for l in [l.split() for l in maListe] if len(t) > 2]
^
|
------------+
[t[2] for t in [l.split() for l in maListe] if len(t) > 2]
oui en effet merci.
Eric
--
O : J'aimerais savoir si en plus d'être cocu, je suis con...
BG : Si ce n'est pas par le cul que se font les cocons,
c'est bien par le con que ce font les cocus.
-+- in: Guide du Cabaliste Usenet - Bien configurer son cocon -+-
[t[2] for l in [l.split() for l in maListe] if len(t) > 2] ^
| ------------+
[t[2] for t in [l.split() for l in maListe] if len(t) > 2]
oui en effet merci.
Eric -- O : J'aimerais savoir si en plus d'être cocu, je suis con... BG : Si ce n'est pas par le cul que se font les cocons, c'est bien par le con que ce font les cocus. -+- in: Guide du Cabaliste Usenet - Bien configurer son cocon -+-
Gerard Flanagan
Gerard Flanagan wrote:
Gerard Flanagan wrote:
jean-marc pouchoulon wrote:
Bonjour à tous,
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] --------------------------------------------------------------------- ------ exceptions.IndexError Traceback (most recent call last)
[...]
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
['c','c','c','c']
ou (sans list comprehension) avec 'ifilter', 'map' et 'lambda' :
A = [ 'abc', 'ab', 'abc', 'a', 'abc' ]
from itertools import ifilter from operator import itemgetter
je veux créer une liste via une autre liste. Mais j'ai des
enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe]
--------------------------------------------------------------------- ------
exceptions.IndexError Traceback (most
recent call last)
[...]
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
['c','c','c','c']
ou (sans list comprehension) avec 'ifilter', 'map' et 'lambda' :
A = [ 'abc', 'ab', 'abc', 'a', 'abc' ]
from itertools import ifilter
from operator import itemgetter
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] --------------------------------------------------------------------- ------ exceptions.IndexError Traceback (most recent call last)
[...]
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
['c','c','c','c']
ou (sans list comprehension) avec 'ifilter', 'map' et 'lambda' :
A = [ 'abc', 'ab', 'abc', 'a', 'abc' ]
from itertools import ifilter from operator import itemgetter
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] --------------------------------------------------------------------------- exceptions.IndexError Traceback (most recent call last)
[...]
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
['c','c','c','c']
ou (sans list comprehension) avec 'ifilter', 'map' et 'lambda' :
A = [ 'abc', 'ab', 'abc', 'a', 'abc' ]
from itertools import ifilter from operator import itemgetter
res = [] for s in A: try: res.append(s.split()[2]) except IndexError: pass
!-)
Après, faut benchmarker avec un bon échantillon des données effectivements attendues pour choisir...
-- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in ''.split('@')])"
Gerard Flanagan wrote:
Gerard Flanagan wrote:
Gerard Flanagan wrote:
jean-marc pouchoulon wrote:
Bonjour à tous,
je veux créer une liste via une autre liste. Mais j'ai des
enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe]
---------------------------------------------------------------------------
exceptions.IndexError Traceback (most
recent call last)
[...]
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
['c','c','c','c']
ou (sans list comprehension) avec 'ifilter', 'map' et 'lambda' :
A = [ 'abc', 'ab', 'abc', 'a', 'abc' ]
from itertools import ifilter
from operator import itemgetter
je veux créer une liste via une autre liste. Mais j'ai des enregistrements incohérents
In [25]:lPro = [l.split()[2] for l in maListe] --------------------------------------------------------------------------- exceptions.IndexError Traceback (most recent call last)
[...]
avec 'filter' et 'lambda':
A = [ 'abc', 'abc', 'abc', 'q', 'abc' ]
print [ a[2] for a in filter(lambda lst: len(lst) > 2,A) ]
['c','c','c','c']
ou (sans list comprehension) avec 'ifilter', 'map' et 'lambda' :
A = [ 'abc', 'ab', 'abc', 'a', 'abc' ]
from itertools import ifilter from operator import itemgetter