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)
3 Réponses :
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 :-)
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.
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
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
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 >
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?