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 Réponses :
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é.
Il demande parce que cela pourrait être fait avec la récursivité: else: peu importe (label + "_")
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)
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.)
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.