1
votes

Comment imprimer la `` nième '' valeur de la sortie de la boucle For en python

Je me demandais donc s'il y avait un moyen d'imprimer la nième valeur (pas la dernière valeur) à partir d'une sortie For Loop. Par exemple: supposons que je veuille imprimer uniquement la valeur du «cinquième au dernier» ou simplement la valeur du «troisième au dernier» de la sortie de la boucle For. Une idée comment puis-je faire ça? Je suis novice en codage / python et je construis ce code après avoir fait beaucoup de recherches et d'apprentissage en cours de route. Donc, toute aide appréciée.

Actuellement, le code ci-dessous me donne la dernière valeur.

from datetime import timedelta, date

def daterange(start_date, end_date):
    for n in range(int(start_date.day), int((end_date - start_date).days), 90):
        yield start_date + timedelta(n)

start_date = date(2016, 1, 1)
end_date = date.today()
for single_date in daterange(start_date, end_date):
    x = single_date.strftime("%Y-%m-%d")

print(x)


2 commentaires

Un problème avec ce code est qu'il suppose (implicitement) que l'itérateur n'est pas vide. Si l'itérateur est vide, il lèvera UnboundLocalError .


Eh bien, j'ai obtenu le code de ce lien ici. stackoverflow.com/ questions / 1060279 /… Je n'étais pas au courant de ce problème. Comment puis-je réparer cela?


3 Réponses :


3
votes

La technique consiste à accumuler les résultats dans un conteneur, puis à réimprimer le n-ième élément.

Une possibilité est d'utiliser collections.deque () avec une valeur maxlen définie sur n .

2018-12-17

Le code ci-dessus génère la cinquième entrée la plus ancienne.

from datetime import timedelta, date
from collections import deque

def daterange(start_date, end_date):
    for n in range(int(start_date.day), int((end_date - start_date).days), 90):
        yield start_date + timedelta(n)

window = deque([], maxlen=5)
start_date = date(2016, 1, 1)
end_date = date.today()
for single_date in daterange(start_date, end_date):
    x = single_date.strftime("%Y-%m-%d")
    window.append(x)

print(window[0])

Le code ci-dessus accumule la plus récente valeurs dans une fenêtre glissante de largeur 5 . La valeur la plus ancienne en position 0 et la valeur la plus récente en position -1.

Vous pouvez modifier le 5 être n'importe quelle valeur de n dont vous avez besoin.

J'espère que cela vous aidera :-)


3 commentaires

Oui, cela aide beaucoup. :) Je n'aurais jamais pu le deviner. J'ai aussi appris quelque chose de nouveau. Merci beaucoup.


Cela peut être assez gourmand en mémoire si vous recherchez le nième élément pour un gros n . Je pense que la solution Rahul Raj est meilleure pour le cas général.


L'OP a énuméré des exemples du 3e au dernier ou du 5e au dernier. Il n'y avait aucune mention de centaines de milliers ou de millions qui consommeraient beaucoup de mémoire.



1
votes

Vous pouvez utiliser enumerate lors de la boucle, ce qui donne le nombre d'itérations. Vous pouvez fournir une condition à l'intérieur en fonction des valeurs dont vous avez besoin pour imprimer comme suit:

from datetime import timedelta, date

def daterange(start_date, end_date):
    for n in range(int(start_date.day), int((end_date - start_date).days), 90):
        yield start_date + timedelta(n)

start_date = date(2016, 1, 1)
end_date = date.today()
n=5
length =len(list(daterange(start_date, end_date)))

for i,single_date in enumerate(daterange(start_date, end_date)):
    x = single_date.strftime("%Y-%m-%d")
    if i == length-n:
        print(x)

J'espère que cela aide


4 commentaires

Merci pour votre réponse. Je cherchais une seule valeur spécifique dans la liste et la solution Raymond Hettinger me donne ce que je cherchais. J'apprécie quand même l'aide. :)


Désolé, je n'ai pas reçu la question la fois précédente. J'ai mis à jour ma réponse maintenant. Faites-moi savoir si c'est ce que vous attendez.


si je dois mettre à jour automatiquement la valeur n en fonction d'une condition, comment puis-je faire cela?


Dans ce cas, vous pouvez l'écrire sous une fonction et lui passer n comme paramètre



0
votes

Vous pouvez utiliser le découpage pour obtenir uniquement certains éléments par index. Cependant, le découpage ne fonctionne pas sur les générateurs, vous devrez donc effectuer un cast en liste.

from datetime import timedelta, date

def daterange(start_date, end_date):
    for n in range(int(start_date.day), int((end_date - start_date).days), 90):
       yield start_date + timedelta(n)

start_date = date(2016, 1, 1)
end_date = date.today()
for single_date in list(daterange(start_date, end_date))[4:]:
    x = single_date.strftime("%Y-%m-%d")
    print(x)

Cela affichera le 5e (index: 4) jusqu'au dernier élément.

p >


0 commentaires