Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Gérer les exceptions dans "une list comprehension"

11 réponses
Avatar
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....)

Est ce possible ?

10 réponses

1 2
Avatar
Eric Deveaud
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]


Eric

--
±z¬O§_¸g±`¬°¦p¦ó©Ý®i¦æ¾PºÞ¹D¶Ë¸£µ¬?
¥Zµn³ø¯È,Âø»x¼s§i©Î¶l±H¢Ò¢Û (Direct Mail)¬O§_¤w¸gµLªk¹F¦¨±z¹w´Áªº¼s§i®ÄªG?
Je vous invite a consulter dans un premier temps le french-Howto.

-+- JCD in Guide du linuxien pervers - "Bien configurer la lisibilité de fcolm"

Avatar
bruno at modulix
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]



--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
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('@')])"

Avatar
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

Avatar
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

getter = itemgetter(2)
filtre = ifilter(lambda lst: len(lst) > 2,A)
print map(getter, filtre)

['c', 'c', 'c']

Gerard


Avatar
Eric Deveaud
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 -+-


Avatar
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

getter = itemgetter(2)
filtre = ifilter(lambda lst: len(lst) > 2,A)
print map(getter, filtre)

['c', 'c', 'c']



et en relisant le question...!-):

A = [ 'a b c', 'a b', 'a b c', 'a', 'a b c' ]

import string
from operator import itemgetter
from itertools import ifilter, imap

split = string.split

print
print [ a[2] for a in ifilter(lambda lst: len(lst)>2,imap(split,A)) ]

getter = itemgetter(2)
filtre = ifilter(lambda lst: len(lst)>2,imap(split,A))
print map(getter, filtre)

Gerard



Avatar
bruno at modulix
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

getter = itemgetter(2)
filtre = ifilter(lambda lst: len(lst) > 2,A)
print map(getter, filtre)

['c', 'c', 'c']




et en relisant le question...!-):

A = [ 'a b c', 'a b', 'a b c', 'a', 'a b c' ]

import string
from operator import itemgetter
from itertools import ifilter, imap

split = string.split

print
print [ a[2] for a in ifilter(lambda lst: len(lst)>2,imap(split,A)) ]

getter = itemgetter(2)
filtre = ifilter(lambda lst: len(lst)>2,imap(split,A))
print map(getter, filtre)


Et pour ceux qui se grattent la tête:

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('@')])"




Avatar
Michel Claveau
Bonsoir !

Il est aussi possible d'appeler une fonction dans la liste en
intention:

def test(i):
if i!="33 3 3":
return True
else:
return False

maListe=["1 1 1","2 2 2","33 3 3","4 4 44","5 5 5 5","6 6 6"]
print [l.split()[2] for l in maListe if test(l)]

--
@-salutations

Michel Claveau
Avatar
Bruno Desthuilliers
(snip)

def test(i):
if i!="33 3 3":
return True
else:
return False


Hum...

def test(i):
return i != "33 3 3"

1 2