J'ai une liste avec ces éléments:
hours = ['19:30', '20:10', '20:30', '21:00', '22:00']
6 Réponses :
Vous pouvez utiliser des fonctions dans le module Time; TIME.Stryptime () CODE> Permet d'analyser une chaîne dans un Table Table-Toile, puis Time.MKTime () Code> Convertit ceci en secondes. Vous pouvez ensuite simplement comparer tous les articles en secondes et trouver la plus petite différence. P>
import bisect
# you can use the time module like katrielalex answer which a standard library
# in python, but sadly for me i become an addict to dateutil :)
from dateutil import parser
hour_to_get = parser.parse('20:18')
hours = ['19:30', '20:10', '20:30', '21:00', '22:00']
hours = map(parser.parse, hours) # Convert to datetime.
hours.sort() # In case the list of hours isn't sorted.
index = bisect.bisect(hours, hour_to_get)
if index in (0, len(hours) - 1):
print "there is no show running at the moment"
else:
print "running show started at %s " % hours[index-1]
Hope this can help you :)
Cela suppose que des heures avec des heures ou des minutes à un chiffre sont représentées avec un zéros de premier plan pour les valeurs respectives.
il peut les convertir du début avant d'appeler bisect.bisect
BISECT fonctionne si la liste est triée. Considérer heures = ['19: 30 ', '20: 10', '20: 30 ', '23: 00', '21: 00 ', '22: 00'] code>
Une telle solution simple ... merci beaucoup.
@singularity: True, mais cela devrait faire partie de votre réponse car, comme votre réponse se tiendra maintenant, elle est incorrecte.
-1 Ceci est élégant jusqu'à ce que vous pensiez à toutes les manières dont il peut se tromper, de ne pas mentionner que vous réémayez fondamentalement la mise en œuvre min code>. Une fois que vous avez été rembourré tous les temps, les triés, a analysé les deux éléments adjacents de la liste et trouvés leur minimum, l'élégance disparaît.
@ Space_c0wb0y: avons-nous un examen ou quoi ??? Je sais que je suis juste donné une indication à l'OP et je pense qu'il peut continuer à partir de là
@Katrielaalex: Ne vous précipitez pas et ne mettez pas A -1 Vérifiez le TIMOIT.
@singularity: Je pense que mon vote Stil est stande: votre réponse, surtout maintenant que vous avez ajouté tout le cruft supplémentaire, n'est pas la bonne façon de le faire. Surtout depuis que vous avez maintenant besoin DateUtil code>, qui n'est pas standard avec Python. Si des nanosecondes supplémentaires sont importantes, l'OP ne devrait pas utiliser Python de toute façon.
@Katrielaalex: heheheh joue-t-on dans le code de golf ???? Maintenant, vous venez de me démontrer que la plupart des gens ici ne comprennent pas ce qu'est un code bon ou mauvais, moins de code de ligne ne signifie pas que c'est bon, mais bien je m'en fiche de votre vote en bas, apprenez à lire le code c'est tout
@Singularity: De votre profil, j'ai appris que vous pensez que la plupart des gens sur Stackoverflow sont des secousses. Je soupçonne que leur réaction vous ait peut-être quelque chose à voir avec la façon dont vous formulez vos commentaires qui rencontrent aussi agressifs. Au moins c'est mon impression. @ Space_C0WB0Y et @Katrielaalex ont écrit des critiques honnêtes, correctes et équitables de votre réponse, et vous les revenez avec une vengeance. Pensez-y.
@Tim Pietzcker: Quelle vengeance? Si vous avez lu mon profil, vous saurez que je n'ai jamais mis -1 du tout (ce sera vengeance), spécialement quand certaines personnes ont mis -1 sans mettre un commentaire de ce qui ne va pas; Et pourquoi dans le premier nous mettons -1? Avez-vous pensé à cela? Je pense que -1 devrait être mis à des réponses erronées et non pour répondre que nous ne ressemblons pas, et avez-vous vu tout mon commentaire et votre réponse ou que vous venez de voir celui-ci et que vous pensez que vous pouvez juger? et en fait, je n'ai rien de plus là-bas, je n'aime pas aimer les gens qui sont ici en concurrence et non pour aider les autres
@singularity: je trouve des injections comme "sommes-nous un examen ou quoi ???" ou "heheheh joue-t-on dans le golf de code ????" enfantin et pétulant et capable de distraire des personnes des mérites de votre réponse et de les concentrer sur votre comportement. Mais dans ce cas concret, Katrielaalex a expliqué pourquoi i> il a bulled. À deux reprises. Et il a raison. Votre réponse n'est pas si bonne.
@Tim Pietzcker: Oui, tu as raison, je veux peut-être prendre ma colère sur eux (pour les personnes qui ont mis -1 sans commentaire et ils sont surtout faux non seulement dans mon cas) et malgré tout de même croire en ce que j'ai écrit Dans mon commentaire et ma réponse, c'est bon peut-être pas bon comme le plus voté (faire N - opérateur, faire un min () O (n)) et dans mon cas (une trim de tri) (N), BISECT LOG (N)) Mais si nous regardons le nombre de lignes (code golf), bien sûr que sa réponse sera "gagnée" (droit de la compétition :)). Mais merci d'avoir ouvert mes yeux, je ne devrais jamais faire ce que je faisais, et encore désolé d'avoir pris votre temps;
@katrielaalex, @ space_c0wb0y: Je veux m'excuser pour mon dernier comportement, veuillez accepter mes excuses, et désolé si je vous offense de quelque manière que ce soit;
OK, un problème ici ... Si la liste des heures est: Heures = ['19: 00 ', '20: 45', '21: 45 ', '22: 45', '01: 30 '] Il revient " 20:45 'Quand l'heure donnée est 20h30, par exemple ...
@ ov1d1u: heures = ['19: 00 ', '20: 45', '21: 45 ', '22: 45', '01: 30 '] Il retourne '20: 45' quand l'heure donnée 20:30 B> Excusez-moi mais ce n'est pas l'heure du placard ??? Que devrait-il retourner ???
@Singularity: il devrait renvoyer 19h00, comme je l'ai dit que "je veux utiliser ceci pour trouver le spectacle actuel dans un guide TV". Donc, le spectacle actuel dans ce cas est celui qui a commencé à 19h00 :)
@ ov1d1u: ahhh ok maintenant je comprends que je mettrai à jour ma réponse désolé si je ne l'ai pas eu la première fois.
+1: C'est une bonne réponse car elle identifie le meilleur moyen de rechercher une liste triée - le module BISECT. L'hypothèse des principaux zéros et une liste triée sont équitables étant donné le manque de détails dans la question initiale. La question avait une liste de 24 heures et une liste triée. @singularity - Je vous suggère de faire rouler votre code à la version originale et d'ajouter simplement ces hypothèses. Il était i> une réponse élégante et utile.
Je ne suis pas un programmeur Python, mais j'utiliserais l'algorithme suivant: P>
convertit tout en "minutes après minuit", par ex. alors juste boucle Thorugh heures = [1170 (= 19 * 60 + 30), 1210, ...] code>, actuelTime = 1218 (= 20 * 60 + 18) code>. p>. li>
Heures code> et trouvez la dernière entrée qui est plus petite que actuelTime code>. p> l> l>
ol>
+1: Cela résumerait réellement le problème de la "exposition actuelle". Peut-être qu'il serait peut-être nécessaire de trier les temps en premier.
>>> import datetime
>>> hours = ['19:30', '20:10', '20:30', '21:00', '22:00']
>>> now = datetime.datetime.strptime("20:18", "%H:%M")
>>> min(hours, key=lambda t: abs(now - datetime.datetime.strptime(t, "%H:%M")))
'20:10'
+1 Pour faire ce que l'OP a demandé (trouver l'heure la plus proche), mais il a également écrit qu'il souhaitait trouver le "Exécution actuelle" - donc pour 20:22 code> vous obtenez 20h30 code> Ce qui n'est évidemment pas le spectacle en cours d'exécution.
@katrielaalex & Tim
manière facile mais sale
Qu'essayez-vous? Pourquoi ça n'a pas fonctionné?
Quelles approches avez-vous essayé jusqu'à présent que cela ne fonctionne pas?
Quel résultat voulez-vous si c'est maintenant 20:25? 20h30 est le plus proche, mais c'est à l'avenir, il ne peut donc pas être le spectacle courant actuel ...
Tout exemple en JavaScript sera très apprécié !!