2016-08-02 7 views
3

Я пытаюсь случайным образом выбирать элементы из списка и добавлять их в другой список.Я хочу случайным образом выбирать элементы из списка и добавлять их в другой список без замены

Список элементов я выбирающий из выглядит следующим образом:

data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54] 

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

lists=[[1,'x','x','x','x','x'],[3,'x','x','x','x','x'],[5,'x','x','x','x','x'],[7,'x','x','x','x','x']] 

Я попытался с помощью random.choice, но это дает мне дублирует:

def fill_lists(data): 
for list in lists: 
    for n,i in enumerate(list): 
     if i=='x': 
      list[n]= random.choice(data) 

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

+0

Рандомизировать/перенести значения в данные сначала, а затем начать заполнять списки –

+1

Вы скремблируете данные и разбиваете их. Не уверен, как это сделать на Python, но я уверен, что есть перевод для 'split (sample (data), rep (1: 4, 5)) ' –

ответ

3
import random 
data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54] 
random.shuffle(data) 
lists = [data[i:i+len(data)/4] for i in range(0, len(data), len(data)/4)] 
print(lists) 

Случайное вытягивание из вашего первоначального списка будет иметь тот же эффект, что и перетасовка, а затем потянув в порядок. Затем можно сделать разбивку на подсписки. Если вам нужны отсортированные подсписки, просто сортируйте их по списку позже.

Вы можете изменить количество групп путем изменения делителя len(data)/4

Edit: я пропустил эту часть вашего вопроса:

heads = [1,3,5,7] 
[q.insert(0,p) for p,q in zip(heads,lists)] 
+0

Я думаю, что OP хочет поместить значения в новый список, поэтому list = [data [i: i + 4] для i в диапазоне (0, len (data) , 4)] – Checkmate

+0

Я помещаю значения в новый список. Я предположил, что старый список можно отбросить, но если это не так, он или она может скопировать данные перед перетасовкой. – dashiell

+0

Достаточно справедливо. Я просто пытался сопоставить наименования OPs, чтобы получить тот же результат, что и пример – Checkmate

0

Вы можете использовать random.sample:

data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54] 
random.sample(data, 5) 
# [27, 12, 33, 24, 17] 

Чтобы получить вложенный список его, использовать список понимание

[random.sample(data, 5) for _ in range(5)] 
# [[40, 35, 24, 54, 17], 
# [17, 54, 35, 43, 37], 
# [40, 4, 43, 33, 44], 
# [51, 37, 35, 33, 8], 
# [54, 4, 44, 27, 50]] 

Edit: выше не даст вам уникальные значения; вы должны принять приведенный выше ответ за уникальные значения. Я неправильно понял этот вопрос!

0

Вы могли бы попробовать это, изменяя диапазон внутри функции d для настройки на нужный элемент.

import random 

def f(data): 
    val = random.choice(data) 
    ix = data.index(val) 
    data.pop(ix) 
    return val, data 

def d(data): 
    topholder = [] 
    m = len(data)/4 
    for i in range(4): 
     holder = [] 
     for n in range(m): 
      holder.append(f(data)[0]) 
     topholder.append(holder) 
    return topholder 

d(data) 

Это всегда даст вам 4 списка случайных выборочных значений без дублирования.

0

другой случайный выбор, но при условии, что все вспомогательные списки имеют одинаковый размер, если количество элементов не делится на количество списков (например, попробуйте 7).

from random import shuffle 

def split(data, n): 
    size=int(len(data)/n); 
    for i in range(0, n*size, size): 
     yield data[i:i+size] 


data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54] 
shuffle(data) 
list(split(data, 5)) 
0

Это динамическая функция, которая возвращает список списка, в котором каждый список начинается с указанного значения. Количество вложенных списков определяется количеством стартовых_значений.

import random 

def get_random_list(element_list, starting_values, size_per_group): 
    num_of_groups = len(starting_values) 
    size_per_group -= 1 
    total_elements = num_of_groups * size_per_group 
    random_data = random.sample(element_list, total_elements) 
    return [[starting_values[x]] + random_data[x * size_per_group:(x + 1) * size_per_group] for x in range(num_of_groups)] 

data = [2, 3, 4, 7, 8, 12, 17, 24, 27, 33, 35, 36, 37, 38, 40, 43, 44, 50, 51, 54] 

print(get_random_list(data, starting_values=[1, 2, 3, 4, 5, 6], size_per_group=2)) 
# OUTPUT: [[1, 36], [2, 54], [3, 17], [4, 7], [5, 35], [6, 33]] 
print(get_random_list(data, starting_values=[9, 3, 5], size_per_group=6)) 
# OUTPUT: [[9, 54, 2, 7, 38, 24], [3, 35, 8, 37, 40, 17], [5, 44, 4, 27, 50, 3]] 

Он работает для Python2.x и Python3.x но Python2.x вы должны изменить range() к xrange() для более эффективного использования памяти.