2012-02-11 62 views
1
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]] 

我已經有一個功能,但它是非常粗糙和不可靠的(快速正髒),它是大約15線,所以我很想看看名單-comprehension /或lambda可以在這裏做=)創建字節範圍(請求部分數據非常有用)

如果你們堅持,這裏是我的版本: 請注意,我沒有時間給這個想那麼多,只是一些會盡快工作。 :)棄用通知!:< ==

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 
+1

不應該是250,499和500,749和750,953? – KillianDS 2012-02-11 11:20:03

+2

您應該包含您的該功能的版本。 – 2012-02-11 11:22:09

+0

@DanD。它太快 - 骯髒,我不應該。它只是得到冗餘等,並不會讓任何人受益(好吧,如果有一個很好的答案;) – ofko 2012-02-11 11:30:34

回答

2

一個鬆散,但可讀的版本:

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]) 
+0

我想我喜歡這個,這很清楚。我不會稱這個冗長的大聲笑,那麼你叫什麼我的 - 有憐憫 – ofko 2012-02-11 12:08:05

1

尤爾的例子是有點過(第二部分具有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)]] 

還你應該創建一個列表的元組。

+0

是的,當時,最後一部分的結束範圍可能會留空,因爲我接受的服務器被接受了,所以我沒有嘗試進行修改。 – ofko 2012-02-11 12:05:52

1

您的輸出是不正確的,因爲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]]