python -datetime выводит -1 день вместо желаемого вывода - PullRequest
1 голос
/ 12 июля 2020

Итак, моя цель - изменить этот вывод с datetime:

time left: -1 day, 23:57:28

На это:

time left: 0:00:30

Теперь это должно быть Dynami c, как код предполагается изменить в словаре. Я пытаюсь понять, почему он выводится с помощью

-1 day, 23:57:28

. Я пробовал переместиться туда, где он выполняется, и даже изменить какой-то другой код. Я просто не понимаю, почему он показывает -1 день. Похоже, что она выполняется слишком много раз

Также, примечание, цель этой программы - выяснить, сколько песен может поместиться в список воспроизведения с учетом ограничений по времени. Кажется, я не могу понять, какое утверждение if должно работать. Может ли кто-нибудь помочь с этим?

Это текущий вывод программы:

0:02:34
0:06:30
Reached limit of 0:07:00
time left: -1 day, 23:57:28

См. Код ниже:

import datetime

#durations and names of songs are inputted here
timeDict = {
    'Song1' : '2:34',
    'Song2' : '3:56',
    'Song3' : '3:02'
}


def timeAdder():

   #assigns sum to the datetime library's timedelta class
    sum = datetime.timedelta()

    #sets the limit, can be whatever
    limit = '0:07:00'

    #calculates the sum
    for i in timeDict.values():
         (m, s) = i.split(':')
         d = datetime.timedelta(minutes=int(m), seconds=int(s))
         sum += d

       #checks whether the limit has been reached
         while str(sum)<limit:
             print(sum)
             break

        
         
         
         #commits the big STOP when limit is reached
         if str(sum)>limit:
            print("Reached limit of " + limit)
            break

    #timeLeft variable created as well as datetime object conversion to a string       
    x = '%H:%M:%S'
    timeLeft = datetime.datetime.strptime(limit, x) - datetime.datetime.strptime(str(sum), x)

    for i in timeDict:
        if timeDict[i] <= str(timeLeft): 
            print("You can fit " + i + " into your playlist.")
    print("time left: " + str(timeLeft))
            

def main():
    timeAdder()
    
main()

Любая помощь с этим будет оценен.

1 Ответ

1 голос
/ 12 июля 2020

Кажется, что он выполняется слишком много раз

Bin go. Проблема здесь:

sum += d

...

#commits the big STOP when limit is reached
if str(sum)>limit:
  print("Reached limit of " + limit)
  break

Вы сразу добавляете свою сумму, а затем проверяете, не превышает ли она лимит. Вместо этого вам нужно проверить, будет ли добавление к сумме превышать предел до того, как вы действительно добавите его.

Две другие вещи: во-первых, sum - это ключевое слово Python, поэтому вы не хотите использовать его как имя переменной. Во-вторых, вы никогда не захотите сравнивать данные как строки, вы получите странное поведение. Например:

>>> "0:07:30" > "2:34"
False

Итак, все ваше время должно быть timedelta объектов.

Вот новый код:

def timeAdder():
   #assigns sum to the datetime library's timedelta class
    sum_ = datetime.timedelta()

    #sets the limit, can be whatever
    limit = '0:07:00'
    (h, m, s) = (int(i) for i in limit.split(":"))
    limitDelta = datetime.timedelta(hours=h, minutes=m, seconds=s)

    #calculates the sum
    for i in timeDict.values():
         (m, s) = i.split(':')
         d = datetime.timedelta(minutes=int(m), seconds=int(s))

         if (sum_ + d) > limitDelta:
            print("Reached limit of " + limit)
            break
         
         # else, loop continues
         sum_ += d
         print(sum_)
     
    timeLeft = limitDelta - sum_

    for songName, songLength in timeDict.items():
        (m, s) = (int(i) for i in songLength.split(':'))
        d = datetime.timedelta(minutes=m, seconds=s)
        if d < timeLeft: 
            print("You can fit " + songName + " into your playlist.")
    print("time left: " + str(timeLeft))

Демо

...