J'ai huit variables que je veux vérifier Agiandst la ligne actuelle dans la boucle pour la boucle. Je pense qu'il pourrait y avoir une meilleure façon de le faire que ce que j'ai actuellement.
J'en ai maintenant 5 déclarations différentes si P>
with open('stuff.txt', 'r') as f: lines = f.read().splitlines() for line in lines: if line == str(sameDay): bag.append(line) if line == str(threeDaysAgo): bag.append(line) if line == str(weekAgo): bag.append(line) if line == str(monthAgo): bag.append(line) if line == str(threeDaysAgo): bag.append(line)
5 Réponses :
if line in [str(x) for x in [sameDay, threeDaysAgo, weekAgo, monthAgo]]: bag.append(line) You might want to save the list in a variable beforehand to make this a bit more clean.
mieux que d'avoir de nombreux si code> déclarations, et aussi plus efficaces que l'appelant sur
appendez code> plusieurs fois.
variables = set(map(str, [sameDay, threeDayAgo, weekAgo...]))
def check_variables(lines):
for line in lines:
if line in variables:
yield line
Le rendement code> est plus efficace de mémoire que la création d'une liste
code>, puis de sortie. Cela est dû à l'évaluation paresseuse qui est intégrée avec
rendement code> et générateurs. De plus, si vous souhaitez effectuer une liste, et non un générateur, appelez la liste
(Check_Variables (...)) code> est en réalité plus rapide que l'appelant
ANNEXE code>
Vous pouvez supprimer Définir une liste de valide_lines code> et vérifier si la ligne de lecture est dans la liste. Si oui, puis appendez-le au sac.
De plus, nous pouvons utiliser la compréhension de la liste pour l'efficacité.
VALID_LINES = [str(sameDay), str(threeDaysAgo), str(weekAgo), str(monthAgo), str(threeDaysAgo)]
with open('stuff.txt', 'r') as f:
lines = f.read().splitlines()
[bag.append(line) for line in lines if line in VALID_LINES]
Vous pouvez utiliser:
acceptable = {str(e) for e in [sameDay, threeDaysAgo, monthAgo, hreeDaysAgo]} with open('stuff.txt', 'r') as f: bag = [line for line in f.readlines() if line in acceptable ]
Comme Python n'a pas de relevés de basculement, vous pouvez donc utiliser la fonction suivante comme cas de commutation. Et vous pouvez implémenter la logique de retour de votre fonction selon vos besoins. Comme vous êtes une ligne ajoutée à chaque fois, cette fonction renvoie la même ligne à chaque fois.
def f(line): return { 'sameDay': line, 'threeDaysAgo': line, 'weekAgo':line, 'monthAgo':line, 'threeDaysAgo':line }.get(line) bag = [] for line in lines: bag.append(f(line))
donne keyerror code> si la ligne ne correspond pas.
Au lieu de cela, utilisez la méthode d'obtenir code> sur un dictionnaire, qui ne posera pas une exception.
Dans tous les cas, vous appendez
ligne code>. Quelle est l'utilisation de contrôles séparés alors? Vous pouvez avoir un
si code> vérifier pour vérifier si
ligne code> est égal à l'un des jours / semaines / mois et de l'annexe.
Vos variables, (un jour, ...) sont de type de chaîne?
@ rusu_ro1 Ils sont "DateTime.date", mais Awakenedhakis solution fonctionne
Je pense que presque toutes les autres réponses vont fonctionner