0
votes

Comment vérifier efficacement les variables dans A pour boucle

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)


4 commentaires

Dans tous les cas, vous appendez ligne . Quelle est l'utilisation de contrôles séparés alors? Vous pouvez avoir un si vérifier pour vérifier si ligne 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


5 Réponses :


0
votes
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.

0 commentaires

1
votes

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


1 commentaires

Le rendement est plus efficace de mémoire que la création d'une liste , puis de sortie. Cela est dû à l'évaluation paresseuse qui est intégrée avec rendement et générateurs. De plus, si vous souhaitez effectuer une liste, et non un générateur, appelez la liste (Check_Variables (...)) est en réalité plus rapide que l'appelant ANNEXE



0
votes

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]


0 commentaires

0
votes

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 ]


0 commentaires

0
votes

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))


2 commentaires

donne keyerror si la ligne ne correspond pas.


Au lieu de cela, utilisez la méthode d'obtenir sur un dictionnaire, qui ne posera pas une exception.