Предположим, у меня был список на Python.Какой самый питонный и эффективный способ рандомизировать его по разделам? - PullRequest
0 голосов
/ 24 июля 2010

У меня есть список X предметов. Я хочу, чтобы первые 10 были рандомизированы. Затем вторые 10 пунктов должны быть рандомизированы. Тогда 3-й.

Какой самый эффективный способ сделать это?

Ответы [ 3 ]

2 голосов
/ 24 июля 2010

Хорошо разбивать проблемы на более мелкие проблемы, которые можно решить с помощью повторно используемых деталей.Идиома grouper предоставляет одну такую ​​многократно используемую часть: она выполняет итерацию и группирует свои элементы в группы размером n:

import random
import itertools

def grouper(n, iterable, fillvalue=None):
    # Source: http://docs.python.org/library/itertools.html#recipes
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    return itertools.izip_longest(*[iter(iterable)]*n,fillvalue=fillvalue)

X=100
alist=xrange(X)
blist=[]
for group in grouper(10,alist):
    group=list(group)
    random.shuffle(group)
    blist.extend(group)
    print(group)

# [7, 6, 4, 9, 8, 1, 5, 2, 0, 3]
# [16, 19, 11, 15, 12, 18, 10, 17, 13, 14]
# [26, 27, 28, 22, 24, 21, 23, 20, 25, 29]
# [33, 32, 37, 39, 38, 35, 30, 36, 34, 31]
# [49, 46, 47, 42, 40, 48, 44, 43, 41, 45]
# [55, 51, 50, 52, 56, 58, 57, 53, 59, 54]
# [69, 66, 61, 60, 64, 68, 62, 67, 63, 65]
# [73, 76, 71, 78, 72, 77, 70, 74, 79, 75]
# [85, 88, 82, 87, 80, 83, 84, 81, 89, 86]
# [92, 90, 95, 98, 94, 97, 91, 93, 99, 96]  

print(blist)
# [7, 6, 4, 9, 8, 1, 5, 2, 0, 3, 16, 19, 11, 15, 12, 18, 10, 17, 13, 14, 26, 27, 28, 22, 24, 21, 23, 20, 25, 29, 33, 32, 37, 39, 38, 35, 30, 36, 34, 31, 49, 46, 47, 42, 40, 48, 44, 43, 41, 45, 55, 51, 50, 52, 56, 58, 57, 53, 59, 54, 69, 66, 61, 60, 64, 68, 62, 67, 63, 65, 73, 76, 71, 78, 72, 77, 70, 74, 79, 75, 85, 88, 82, 87, 80, 83, 84, 81, 89, 86, 92, 90, 95, 98, 94, 97, 91, 93, 99, 96]
2 голосов
/ 24 июля 2010

Как насчет этого?

import random

a = [1,2,3,4,5,6,7,8,9,0,'a','b','c','d','e','f','g','h','i','j','k','l','m']
parts=[a[i:i+10] for i in range(0, len(a), 10)]
map(random.shuffle,parts)
result = sum(parts,[])
0 голосов
/ 24 июля 2010
import random

random.seed()
a = [1,2,3,4,5,6,7,8,9,0,'a','b','c','d','e','f','g','h','i','j']

def groupRand (elems, gsize=10):
    temp_list = elems[:]
    result = []
    while temp_list:
        aux = temp_list[:gsize]
        random.shuffle (aux)
        result += aux
        del(temp_list[:gsize])
    return result

print (groupRand(a))

# [7, 8, 3, 1, 0, 6, 9, 4, 2, 5, 'i', 'e', 'g', 'b', 'h', 'c', 'j', 'd', 'f', 'a']
...