C’est pour des trucs comme ça que j’adore Python… 13


La manipulation de structures de données est fantastique dans ce langage.

J’avais un problème du genre :

“soit des personnes dans une file ayant un rang supposé…””

persons = [
    ('Nadine', 3),
    ('Tom', 2),
    ('Christophe', 7),
    ('Cloclo', 1),
    ('Lily', 5),
    ('Georges', 7),
    ('Paul', 6),
    ('Bérénice', 4),
    ('Ursula', 10),
    ('Lea', 15)
]

“…trouver, parmi les 5 premières, celles qui sont effectivement à leur place”

Vous connaissez mon amour immodéré pour les listes en intention en Python :

>>> [name for i, (name, rank) in enumerate(persons[:5]) if (i + 1) == rank]
[u'Tom', u'Lily']

Snif. j’en pleurerais presque.

13 thoughts on “C’est pour des trucs comme ça que j’adore Python…

  • Sam Post author

    Arf, je viens de m’appercevoir qu’on peut faire mieux :

    [name for i, (name, rank) in enumerate(persons[:5], 1) if i == rank]
  • kontre

    Dans ce cas j’aurais laissé le keyword “start=” devant le 1 pour plus de clarté (même si c’est plus long, du coup). Bon, je retourne enculer mes mouches…

  • Policier Moustachu

    Quand je vois que tu encules les mouches un peu plus après avoir trouvé une solution déjà très élégante, je comprends mieux l’opposition de style entre toi et Max.

    Sinon j’ai lu ça et les deux articles sur les listes en intentions, et j’ai appris plein de trucs. Ca m’a relancé sur les yield et tout aussi.

    Donc merci.

  • Gontran

    C’est tellement sexe les listes en intention (en compréhension en bon français matheux), mais tellement pas adapté à PEP8 dès que ça devient un peu bourrin…

  • kontre

    Tu peux la mettre sur plusieurs lignes sans problème (si c’est bien de ça que tu aprlers pour le PEP8) :

    [name
     for i, (name, rank) in enumerate(persons[:5], 1)
     if i == rank]
  • Gontran

    @kontre: oui, tu peux le découper. Mais là, c’est plutôt court. Quand t’a pas mal de traitement, des if à la fois dans le map et le filter, tu te retrouve vite avec des lignes coupées illisibles.

    (@sam, @max : vous pourriez pas viter l’email obligatoire pour commenter ?)

  • Sam Post author

    Il faudrait installer un plugin de plus, et honetement, j’ai pas la foi. Si max veut le faire, j’y vois pas d’inconvénient.

    Quand à la liste en intention sur plusieurs lignes : si votre expression déborde, c’est qu’il faut en faire une boucle ordinaire. Les listes en intentions ne sont pas là pour créer du code illisible.

Leave a comment

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.