1
votes

Manière pythonique d'écrire en cascade des boucles et des instructions if?

C'est peut-être une question super stupide mais je me demandais quelle est la manière pythonique d'écrire ces conditions:

custom_field_labels = ['value1', 'value2']

def whatever(label):
    if label not in custom_field_labels:
        custom_field_labels.append(label)
    else:
        invalid_name = True

        while invalid_name:
            label += "_"
            if label not in custom_field_labels:
                custom_field_labels.append(label)
                invalid_name = False

whatever('value1')
whatever('value3')
print(custom_field_labels) # ['value1', 'value2', 'value1_', 'value3']

J'ai lu que la récursion est une mauvaise idée en python. Est-ce vrai? Si oui, quelles sont les autres options?


3 commentaires

Qu'est-ce que vous essayez d'accomplir?


Je voudrais ajouter "_" dans une chaîne alors qu'elle existe à l'intérieur de custom_field_labels. S'il n'existe pas, ajoutez simplement la valeur.


@placplacboom Pouvez-vous nous en dire plus? Ce n’est toujours pas tout à fait clair pour moi.


3 Réponses :


0
votes

Je voudrais ajouter "_" dans une chaîne alors qu'il existe dans custom_field_labels.

Alors fais exactement ça?

def whatever(label):
    while label in custom_field_labels:
        label += "_"
    custom_field_labels.append(label)

Vous ne savez pas pourquoi vous posez des questions sur la récursivité.


1 commentaires

Il demande parce que cela pourrait être fait avec la récursivité: else: peu importe (label + "_")



5
votes

Vous n'avez besoin que d'une boucle while .

while True:
    # do stuff
    if <some condition>:
        break;

Si label n'est pas dans la liste, la boucle ne sera jamais entrée vous allez donc ajouter l'étiquette d'origine; c'est essentiellement le même que le premier if .

Je recommande également de ne pas utiliser le modèle

while boolean_variable:
    # do stuff
    if <some condition>:
        boolean_variable = False

Soit tester la condition elle-même dans la condition while , ou utilisez:

while label in custom_field_labels:
    label += "_"
custom_field_labels.append(label)


0 commentaires

0
votes

Plutôt que de stocker directement les étiquettes presque identiques, vous pouvez utiliser un objet Counter et reconstruire les étiquettes si nécessaire.

>>> from collections import Counter
>>> c = Counter(["value1", "value2"])
>>> c['value1'] += 1
>>> c['value3'] += 1
>>> c
Counter({'value1': 2, 'value2': 1, 'value3': 1})
>>> [x+"_"*i for x, n in c.items() for i in range(n)]
['value1', 'value1_', 'value2', 'value3']

(Cela soyez gentil s'il y avait une méthode add pour que c.add (x) soit équivalent à c [x] + = 1 . Oh, bien.)


0 commentaires