Найти - Пользователи
Полная версия: Разбить отрезок времени на равные части.
Начало » Python для новичков » Разбить отрезок времени на равные части.
1 2
Jeck290
Делаю скрипт для автоматической разбивки аудио файлов , вот есть одна функция:

def get_period_sec(part=2, sec=0):
    temp_period = []
    d = sec / part
    a = 0
    b = 0
    for _ in range(part):
        if range(part)[-1] == _:
            a = sec
            temp_period.append([b, a])
            b = d + b
        else:
            a = d + a
            temp_period.append([b, a])
            b = d + b
    print temp_period
get_period_sec(part=3, sec=394)

[, , ]

он выдает равные отрезки времени в списке.

Хотелось бы посмотреть как кто решит эту проблему более эффективным методом. В данном случае все очень примитивно написано =)
FishHook
def split_int(i, parts=2):
    result = []
    chunk = i / parts
    for p in range(parts):
        start = p * chunk
        result.append([start, start + chunk])
    return result
Jeck290
Например если хотим 394 секунды разбить на 40 частей этот алгоритм в последнем чанке конечное число будет 360 а у нас 394 секунды, выходит полностью и правильно аудио файл мы не разобьем всегда будет нехватать несколько секунд ))
Так что тут как бы ты не много не дописал FishHook.
py.user.next
Jeck290
он выдает равные отрезки времени в списке
>>> get_period_sec(part=2, sec=11)
[[0, 5], [5, 11]]
>>>

0 - 5 – 6 секунд
5 - 11 – 7 секунд
giveback
def get_period_sec(part, sec):
    avg = sec / float(part)
    out = []
    last = 0.0
    while last < sec:
        out.append([int(last),int(last + avg)])
	last += avg
    return out
Jeck290
py.user.next
py.user.next
0 - 5 – 6 секунд
5 - 11 – 7 секунд
Да знаю, там заглушка стоит , если видим что идет последний цикл итерации то выставляем максимальное число секунд что бы переконвертировать все аудио, просто я не додумался как обойти эту фичу (((
bismigalis
>>> def f(sec, parts):
...     r = range(0, sec, sec/parts)[:-1] + [sec]
...     return zip(r[:-1], r[1:])
... 
>>> f(394, 3)
[(0, 131), (131, 262), (262, 394)]
bismigalis
Jeck290
выходит полностью и правильно аудио файл мы не разобьем всегда будет нехватать несколько секунд ))
тут надо определится, как делить

например 10 секунд на три можно разделить так
012 345 6789
или так
0123 4567 89
py.user.next
bismigalis
тут надо определится, как делить
А для 11 секунд и 3 частей
012 345 6789(10)
0123 4567 89(10)
01234 56789 (10)

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

т.е. второй вариант самый подходящий

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB