Создание диапазонов байтов (полезно для запроса частичных данных) - PullRequest
1 голос
/ 11 февраля 2012
total_byte_len = 954
part_size_limit = 250

Result: #[star_byte, end_byte, bytes_in_part] with 0-based index
[[0, 250, 250], [251, 501, 250], [501, 751, 250], [751, 953, 202]]

У меня уже есть функция, но она очень грубая и ненадежная (quick-n-dirty), и в ней около 15 строк, поэтому я хотел бы посмотреть, что здесь может делать понимание списков / или лямбда =)

Если вы, ребята, настаиваете, вот моя версия: Пожалуйста, обратите внимание, я не думал об этом в то время, просто что-то, что будет работать как можно скорее. :) Уведомление об устаревании !: <== </p>

    def to_json(value):
        return json.dumps(value)

    def getByteRanges(total_byte_len, part_size_limit):

        if total_byte_len%part_size_limit == 0: #devides evenly
            left_over_part = 0
        else:
            left_over_part = 1

        how_many_parts = roundup(((total_byte_len-(total_byte_len%part_size_limit))/part_size_limit)+left_over_part)
        part_size = int(((total_byte_len-(total_byte_len%part_size_limit))/(how_many_parts-left_over_part))) #-1 to not include last part

        parts = [x for x in range(how_many_parts)]

        ranges = []
        for i, obj in enumerate(parts):
            start_range = (part_size*i)+1
            end_range = part_size*(i+1)+1

            if i == 0: #first part
                start_range = 0
                end_range = part_size

            if i == len(parts)-1: #last part
                end_range = total_byte_len-1

            ranges.append([int(start_range), int(end_range), (int(end_range)-int(start_range))])

        return ranges

Ответы [ 3 ]

2 голосов
/ 11 февраля 2012

Подробная, но читаемая версия:

s = []
for p in range(0, total_byte_len, part_size_limit):
    last = min(total_byte_len - 1, p + part_size_limit - 1)
    s.append([p, last, last - p + 1])
1 голос
/ 11 февраля 2012

Ваш вывод не правильный, потому что sum([250, 249, 249, 202]) != 954.

$ python3
>>> def fun(x, y):
...     f= lambda i: y if (x-i)>=y else x%y
...     return [[i, i+f(i)-1, f(i)] for i in range(0, x, y)]
...
>>> fun(954, 250)
[[0, 249, 250], [250, 499, 250], [500, 749, 250], [750, 953, 204]]
1 голос
/ 11 февраля 2012

Ваш пример немного не работает (вторая часть имеет 251 байт), но работает примерно так:

[[x, y - 1, y - x] for x in range(0,total_byte_len, part_size_limit) for y in [min(x + part_size_limit, total_byte_len)]]

также вы, вероятно, должны создать список кортежей.

...