2014-01-29 2 views
2

У меня есть список номеров, таких как [5000, 5000, 5000, 5000, 5000, 5000]Лучший способ разбить список на куски случайного размера?

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

[[5000, 5000], [5000, 5000, 5000], [5000]]

Каков наилучший способ сделать это в python?

+5

Вы хотите фиксированное количество подписчиков? Могут ли они быть пустыми? Какова максимальная длина подсписчика? – RemcoGerlich

+0

Извините, я не включил эту информацию в исходное сообщение. Недостаточно спать - это мое оправдание ха-ха. Да, фиксированное число, они не могут быть пустыми, а максимальная длина должна быть задана в аргументах – Barry

+0

. Верхний ответ на самом деле отлично работает для моих целей. Спасибо всем за ваши предложения. – Barry

ответ

10
from itertools import islice 
from random import randint 

def random_chunk(li, min_chunk=1, max_chunk=3): 
    it = iter(li) 
    while True: 
     nxt = list(islice(it,randint(min_chunk,max_chunk))) 
     if nxt: 
      yield nxt 
     else: 
      break 

демо:

li = [5000, 5000, 5000, 5000, 5000, 5000] 

list(random_chunk(li)) 
Out[45]: [[5000, 5000, 5000], [5000], [5000, 5000]] 

Это приводит к (без учета последней порции) равномерное распределение размеров блоков от min_chunk и max_chunk, в том числе.

1

Heres моя попытка:

from random import randint 

def random_list_split(data): 
    split_list = [] 
    L = len(data) 
    i = 0 
    while i < L: 
     r = randint(1,L-i) 
     split_list.append(data[i:i+r]) 
     i = i + r 
    return split_list 

Некоторые выходные данные:

>>> random_list_split(test) 
[[5000, 5000, 5000, 5000, 5000, 5000], [5000], [5000], [5000]] 
>>> random_list_split(test) 
[[5000, 5000, 5000, 5000], [5000, 5000], [5000, 5000], [5000]] 
>>> random_list_split(test) 
[[5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000], [5000]] 
>>> random_list_split(test) 
[[5000, 5000], [5000, 5000, 5000, 5000], [5000], [5000], [5000]] 
>>> random_list_split(test) 
[[5000, 5000, 5000, 5000, 5000, 5000], [5000], [5000], [5000]] 
>>> random_list_split(test) 
[[5000, 5000, 5000, 5000, 5000, 5000], [5000], [5000], [5000]] 
>>> random_list_split(test) 
[[5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000]] 
1

Вы можете просто итерацию по списку (X) и с фиксированной вероятностью (p) положить элемент в «последнем» подсписка и 1-p на новый один

import random 

sublists = [] 
current = [] 
for x in X: 
    if len(current)>0 and random.random() >= p: 
     sublists.append(current) 
     current = [] 
    current.append(x) 
sublists.append(current) 
1

Вот один метод:

def randsplit(lst): 
    out = [[]] 
    for item in lst: 
     out[-1].append(item) 
     if random.choice((True, False)): 
      out.append([]) 
    return [l for l in out if len(l)] 

Этот метод не мутирует lst и не возвращает никаких пустых списков. Образец:

>>> l = [5000, 5000, 5000, 5000, 5000, 5000] 
>>> randsplit(l) 
[[5000, 5000], [5000, 5000], [5000, 5000]] 
>>> randsplit(l) 
[[5000, 5000, 5000], [5000, 5000], [5000]] 
>>> randsplit(l) 
[[5000], [5000], [5000, 5000], [5000], [5000]] 
1

Это мой подход к ней: Все полученные списки будут иметь по крайней мере один элемент, но он может возвращать список со всеми номерами.

import random 

def randomSublists(someList): 
    resultList = [] #result container 
    index = 0 #start at the start of the list 
    length = len(someList) #and cache the length for performance on large lists 
    while (index < length): 
     randomNumber = random.randint(1, length-index+1) #get a number between 1 and the remaining choices 
     resultList.append(someList[index:index+randomNumber]) #append a list starting at index with randomNumber length to it 
     index = index + randomNumber #increment index by amount of list used 
    return resultList #return the list of randomized sublists 

Тестирование на консоли Python:

>>> randomSublist([1,2,3,4,5]) 
[[1], [2, 3, 4, 5]] 
>>> randomSublist([1,2,3,4,5]) 
[[1], [2, 3], [4], [5]] 
>>> randomSublist([1,2,3,4,5]) 
[[1, 2, 3, 4, 5]] 
>>> randomSublist([1,2,3,4,5]) 
[[1, 2], [3], [4, 5]] 
>>> randomSublist([1,2,3,4,5]) 
[[1, 2, 3, 4, 5]] 
>>> randomSublist([1,2,3,4,5]) 
[[1, 2, 3, 4], [5]] 
>>> randomSublist([1,2,3,4,5]) 
[[1], [2, 3, 4], [5]] 
>>> randomSublist([1,2,3,4,5]) 
[[1], [2, 3], [4], [5]] 
>>> randomSublist([1,2,3,4,5]) 
[[1], [2], [3, 4, 5]] 
>>> randomSublist([1,2,3,4,5]) 
[[1, 2, 3, 4, 5]] 
>>> randomSublist([1,2,3,4,5]) 
[[1, 2, 3], [4, 5]] 
>>> randomSublist([1,2,3,4,5]) 
[[1, 2, 3, 4], [5]] 
+1

ха-ха, а ты тоже думаешь ... –

0
import random 

old_list = [5000, 5000, 5000, 5000, 5000, 5000] 
new_list = [] 
def random_list(old, new): 
    temp = [] 
    for each_item in old: 
     temp.append(each_item) 
     chance = random.randint(0,1) 
     if chance < 1: 
      new.append(temp) 
      temp = [] 
    return new 

несколько выходов:

[[5000, 5000, 5000, 5000], [5000, 5000]] 
[[5000, 5000, 5000, 5000], [5000], [5000]] 
[[5000], [5000], [5000, 5000], [5000, 5000]] 
0

Небольшая вариация на ответ roippi в:

In [1]: import itertools 

In [2]: import random 

In [3]: def random_chunk(li, min_chunk=1, max_chunk=3): 
    ...:  it = iter(li) 
    ...:  return list(
    ...:   itertools.takewhile(
    ...:    lambda item: item, 
    ...:    (list(itertools.islice(it, random.randint(min_chunk, max_chunk))) 
    ...:    for _ in itertools.repeat(None)))) 
    ...: 

In [4]: random_chunk(range(10), 2, 4) 
Out[4]: [[0, 1], [2, 3, 4], [5, 6, 7], [8, 9]] 

In [5]: random_chunk(range(10), 2, 4) 
Out[5]: [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9]] 

In [6]: random_chunk(range(10), 2, 4) 
Out[6]: [[0, 1, 2, 3], [4, 5, 6], [7, 8, 9]] 

In [7]: random_chunk(range(10), 2, 2) 
Out[7]: [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]] 

In [8]: random_chunk(range(10), 1, 2) 
Out[8]: [[0, 1], [2, 3], [4], [5], [6], [7, 8], [9]] 

In [9]: random_chunk(range(10), 1, 2) 
Out[9]: [[0, 1], [2, 3], [4], [5], [6], [7], [8], [9]] 

In [10]: random_chunk(range(10), 1, 20) 
Out[10]: [[0], [1, 2, 3], [4, 5, 6, 7, 8, 9]] 

In [11]: random_chunk(range(10), 1, 20) 
Out[11]: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]] 

In [12]: random_chunk(range(10), 1, 20) 
Out[12]: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]] 

In [13]: random_chunk(range(10), 1, 20) 
Out[13]: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]] 

In [14]: random_chunk(range(10), 1, 20) 
Out[14]: [[0], [1, 2, 3, 4, 5, 6, 7, 8], [9]] 
Смежные вопросы