3 votes

Inline ajouter élément à la liste si condition

Existe-t-il un moyen en python d'ajouter un objet à une liste si une condition est remplie ?

Je veux le faire :

middleware = ["a",
"b",
"c" if DEBUG,
"d"
]

De sorte que si DEBUG est Faux, la liste sera ["a", "b", "d"].

Ma meilleure suggestion actuelle est la suivante :

middleware = ["a",
"b"] + \
(["c"] if DEBUG else []) + \
["d"
]

ce qui ne semble pas très intuitif

4voto

ShadowRanger Points 44

Le plus proche que vous puissiez obtenir est d'utiliser les généralisations supplémentaires de déballage pour décompresser une longueur variable interne tuple (ou list ) sur la base du résultat d'une analyse conditionnelle if/else opérateur :

middleware = ["a",
    "b",
    *(("c",) if DEBUG else ()),  # Or if you like brackets, *(["c"] if DEBUG else [])
    "d"
]

En utilisant le déballage, vous pouvez choisir entre deux séquences internes différentes à déballer, obtenant ainsi le résultat souhaité avec des modifications minimales de votre syntaxe.

Dans le cas spécifique des cordes de longueur un, la ligne du milieu peut être simplifiée comme suit :

    *("c" if DEBUG else ""),

ou même (si DEBUG est un booléen, ou un 0 o >0 valeur entière) :

    *"c"[:DEBUG], 

    *"c" * DEBUG, # For boolean or 0/1 integers only

et celles-ci peuvent être étendues à des chaînes de caractères d'une longueur différente de un en les enveloppant dans list des crochets :

    *["abc"][:DEBUG], 

    *["abc"] * DEBUG, # For boolean or 0/1 integers only

mais toutes ces alternatives tombent dans la catégorie des astuces de programmation "trop intelligentes à moitié" (si vous vous retrouvez à faire beaucoup de maths ou de découpage avec bool s, vous êtes probablement trop intelligent).

1voto

Barmar Points 135986

Je ne pense pas qu'il y ait un moyen plus simple de le faire en ligne.

Il suffit d'écrire un simple if déclaration :

middleware = ["a", "b"]
if DEBUG:
    middleware.append("c")
middleware.append("d")

o

middleware = ["a", "b", "d"]
if DEBUG:
    middleware.insert(2, "c")

Une autre option serait de construire le middleware d'une autre liste qui la contrôle.

mware_with_options = [
    {"name": "a", "type": "always"}, 
    {"name": "b", "type": "always"}, 
    {"name": "c", "type": "debug"}, 
    {"name": "d", "type": "always"}
]
middleware = [item['name'] for item in mware_with_options if item['type'] = "always" or (DEBUG and item['type'] = "debug")]

0voto

blhsing Points 57682

Si les objets de la liste sont tous des chaînes de caractères, comme c'est le cas dans votre question, un compromis un peu moins laid consisterait à utiliser une chaîne f avec un élément split à la place :

middleware = f'''
    a
    b
    {'c' * DEBUG}
    d
'''.split()

EDIT : Révisé pour utiliser l'opérateur multiplicateur en s'inspirant du commentaire de @superbrain.

0voto

blhsing Points 57682

Si les éléments de la liste sont tous des valeurs véridiques, vous pouvez utiliser la fonction and pour régler l'élément sur False si DEBUG est False et de filtrer ensuite les éléments erronés de la liste :

middleware = [
    "a",
    "b",
    DEBUG and "c",
    "d"
]
middleware[:] = filter(None, middleware)

ou,

*middleware, = filter(None, [
    "a",
    "b",
    DEBUG and "c",
    "d"
])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X