Я написал и протестировал приведенный ниже код на Python 3, и он отлично работает:
def format_duration(seconds):
dict = {'year': 86400*365, 'day': 86400, 'hour': 3600, 'minute': 60, 'second': 1}
secs = seconds
count = []
for k, v in dict.items():
if secs // v != 0:
count.append((secs // v, k))
secs %= v
list = [str(n) + ' ' + (unit if n == 1 else unit + 's') for n, unit in count]
if len(list) > 1:
result = ', '.join(list[:-1]) + ' and ' + list[-1]
else:
result = list[0]
return result
print(format_duration(62))
В Python3 результат выше:
1 minute and 2 seconds
Однако тот же код в Python 2.7 возвращает:
62 seconds
Я не могу понять почему. Любая помощь будет принята с благодарностью.






Ответы разные, потому что элементы в вашем dict используются в двух версиях в разном порядке.
В Python 2 dicts неупорядочены, поэтому вам нужно сделать больше, чтобы получить элементы в том порядке, в котором вы хотите.
Кстати, не используйте «dict» или «list» в качестве имен переменных, это усложняет отладку.
Вот фиксированный код:
def format_duration(seconds):
units = [('year', 86400*365), ('day', 86400), ('hour', 3600), ('minute', 60), ('second', 1)]
secs = seconds
count = []
for uname, usecs in units:
if secs // usecs != 0:
count.append((secs // usecs, uname))
secs %= usecs
words = [str(n) + ' ' + (unit if n == 1 else unit + 's') for n, unit in count]
if len(words) > 1:
result = ', '.join(words[:-1]) + ' and ' + words[-1]
else:
result = words[0]
return result
print(format_duration(62))
Идеальное решение. Это важно знать, что dicts действуют по-разному в 2 и 3. Приветствую!