Как преобразовать эту продолжительность в дни/часы/минуты/секунды в Python/Django?

У меня есть такая продолжительность:

(1, 2, 3, 11)

Это в формате дни/часы/минуты/секунды. Как я могу показать что-то вроде: 1 days, 2 hours and 3 minutes. Мне не нужны секунды. Итак, если продолжительность:

(0, 2, 3, 1)

Он должен отображаться как 2 hours and 3 minutes. Если продолжительность:

(0, 0, 3, 11)

Это должно отображаться как 3 minutes.

Как я могу этого добиться? Спасибо


person user1881957    schedule 11.01.2013    source источник


Ответы (2)


Сколько ты собираешься этим заниматься?

Если их много и они будут часто повторяться, вы можете просто написать функцию, которая сделает это за вас;

def days(t):
    oxford_comma = False
    a = [" day", " hour", " minute"]
    s = []
    if len(t) != 4:
        return "incorrect format"
    else:
        for i in range(3):
            if t[i] != 0:
                plural = "s" if t[i] > 1 else ""
                s.append(str(t[i]) + a[i] + plural + ", ")


        if len(s) > 1:
            if not oxford_comma:
                s[-2] = s[-2].replace(",","")
            s.insert(len(s)-1,"and ")
        return "".join(s)[:-2]


    print days((1,2,3,11))      #1 day, 2 hours, and 3 minutes
    print days((0,2,3,1))       #2 hours, and 3 minutes
    print days((0,0,3,11))      #3 minutes
    print days((1,1,1,11))      #1 day, 1 hour, and 1 minute

Измените oxford_comma, если хотите.

Также учитывается множественное число.

Извините, это немного грязно - это определенно можно было бы убрать - торопились!

person will    schedule 11.01.2013
comment
ОП не хочет запятой перед и - person eumiro; 11.01.2013
comment
Это сработало, но из любопытства можно ли отображать минуты, если они равны 1, и отображать минуты, если они больше 1. Тот же случай в часах/минутах. - person user1881957; 11.01.2013
comment
О да, это так. Большое спасибо, приятель! - person user1881957; 11.01.2013

Это отредактированный ответ для Python 2.6 и английского единственного/множественного числа:

def f(x):
    parts = ['%d %s%s' % (a, p, ('', 's')[a > 1]) for a,p in zip(x, ('day', 'hour', 'minute')) if a]
    return ' and '.join(c for c in [', '.join(parts[:-1]), parts[-1]] if c)

Контрольная работа:

>>> print f((1, 2, 3, 11))
1 day, 2 hours and 3 minutes

>>> print f((0, 2, 3, 1))
2 hours and 3 minutes

>>> print f((0, 0, 3, 11))
3 minutes
person eumiro    schedule 11.01.2013
comment
Привет, спасибо за ваш ответ. Но я использую Python 2.6. Не могли бы вы отредактировать свой ответ? - person user1881957; 11.01.2013
comment
@ user1881957 правда? "%d %s" % (a, p) - person mmgp; 11.01.2013
comment
Это сработало, но из любопытства можно ли отображать минуты, если они равны 1, и отображать минуты, если они больше 1. Тот же случай в часах/минутах - person user1881957; 11.01.2013