Quelle est la meilleure façon, à la fois esthétiquement et du point de vue des performances, de diviser une liste d'éléments en plusieurs listes sur la base d'une condition ? L'équivalent de :
good = [x for x in mylist if x in goodvals]
bad = [x for x in mylist if x not in goodvals]
Existe-t-il une manière plus élégante de procéder ?
Voici le cas d'utilisation réel, pour mieux expliquer ce que j'essaie de faire :
# files looks like: [ ('file1.jpg', 33L, '.jpg'), ('file2.avi', 999L, '.avi'), ... ]
IMAGE_TYPES = ('.jpg','.jpeg','.gif','.bmp','.png')
images = [f for f in files if f[2].lower() in IMAGE_TYPES]
anims = [f for f in files if f[2].lower() not in IMAGE_TYPES]
9 votes
J'ai atterri ici à la recherche d'un moyen d'avoir une condition dans l'instruction set builder, votre question a répondu à la mienne :)
8 votes
diviser est une description malheureuse de cette opération, puisqu'elle a déjà une signification spécifique en ce qui concerne les chaînes Python. Je pense que diviser est un terme plus précis (ou du moins moins surchargé dans le contexte des itérables Python) pour décrire cette opération. J'ai atterri ici à la recherche d'un équivalent de liste de
str.split()
, à diviser la liste en une collection ordonnée de sous-listes consécutives. Par exemplesplit([1,2,3,4,5,3,6], 3) -> ([1,2],[4,5],[6])
frente a diviser les éléments d'une liste par catégorie.0 votes
Discussion du même sujet sur python-list.
0 votes
IMAGE_TYPES devrait être un ensemble au lieu d'un tuple :
IMAGE_TYPES = set('.jpg','.jpeg','.gif','.bmp','.png')
. n(1) au lieu de n(o/2), avec pratiquement aucune différence de lisibilité.