2015-07-12 3 views
0

samplesDict - это defaultdict объектов OrderedDict; от Python collections. Для каждого OrderedDict я хотел бы создать копию, в которой порядок рандомизирован.Рандомизированный заказ Python OrderedDict

import collections 
import copy 
import random 
... 
randomizedSamplesDict = copy.deepcopy(samplesDict) 
for k, i in samplesDict.iteritems(): 
    random.shuffle(i) 

Но я продолжаю получать KeyError: 56 на random.shuffle(i) линии; целое число ошибок (например, 56) различно.

Для иллюстрации, один из OrderedDicts может быть

OrderedDict([ 
    ('This is the first key', ['foo', 'baz']), 
    ('And the second key', ['buz', 'baz']), 
    ('Finally the third key', ['bar', 'foo'])]) 

И я хотел бы копию стать

OrderedDict([ 
    ('Finally the third key', ['bar', 'foo']), 
    ('This is the first key', ['foo', 'baz']), 
    ('And the second key', ['buz', 'baz'])]) 
+0

порядок что рандомизированы? Ваш вопрос не имеет смысла, если вы не объясните, что вы пытаетесь сделать с этим. –

ответ

0

Я не совсем уверен, что вы пытаетесь сделать здесь; но вот один способ, чтобы получить конечный результат:

ordered_dicts = samplesDict.values() 

Теперь, если вы хотите получать заказанный Dict случайно:

random.choice(ordered_dict) 

Если вы хотите, чтобы извлечь значения из одного из заказанных dicts случайно:

the_dict_you_want = 1 
random.choice([value for value in ordered_dicts[the_dict_you_want].values()]) 

Если вы просто хотите иметь случайный порядок элементов из заказанных dicts, конвертировать их в нормальных dicts; затем перетасовать клавиши.

0
import collections 
import copy 
import random 

samplesDict = collections.OrderedDict() 
samplesDict[1] = 10 
samplesDict[2] = 20 
samplesDict[3] = 30 
print samplesDict 

keys = samplesDict.keys() 
random.shuffle(keys) 
print keys 

randomizedSamplesDict = collections.OrderedDict() 
for k in keys : 
    randomizedSamplesDict[k] = samplesDict[k] 
print randomizedSamplesDict 

Выход:

OrderedDict([(1, 10), (2, 20), (3, 30)]) 
[2, 1, 3] 
OrderedDict([(2, 20), (1, 10), (3, 30)]) 

Как вы можете видеть, что второй ДИКТ перемешивается (клавишами).

Использование данных я получаю вывод:

... 
samplesDict = collections.OrderedDict([ 
    ('This is the first key', ['foo', 'baz']), 
    ('And the second key', ['buz', 'baz']), 
    ('Finally the third key', ['bar', 'foo'])]) 
... 

OrderedDict([('This is the first key', ['foo', 'baz']), 
('And the second key', ['buz', 'baz']), 
('Finally the third key', ['bar', 'foo'])]) 

['And the second key', 'Finally the third key', 'This is the first key'] 

OrderedDict([('And the second key', ['buz', 'baz']), 
('Finally the third key', ['bar', 'foo']), 
('This is the first key', ['foo', 'baz'])]) 
0

Вы перетасовки неправильные детали, вы должны быть итерация randomizedSamplesDict:

randomizedSamplesDict = copy.deepcopy(samplesDict) 
for k, i in randomizedSamplesDict.items(): 
    random.shuffle(i) 
print(randomizedSamplesDict) 

Вы сделали DeepCopy из samplesDict так что если вам хотите перетасовать заказ в randomizedSamplesDict, вам нужно перебирать этот dict, а не оригинал.

Если вы на самом деле хотите новый Dict с ключами и значениями из samplesDict в случайном порядке использовать элементы из исходного Словаре после перетасовки, чтобы создать новый OrderedDict:

import collections 
import copy 
import random 
samplesDict = collections.OrderedDict([ 
    ('This is the first key', ['foo', 'baz']), 
    ('And the second key', ['buz', 'baz']), 
    ('Finally the third key', ['bar', 'foo'])]) 

items = list(samplesDict.items()) 
random.shuffle(items) 
randomizedSamplesDict = collections.OrderedDict(copy.deepcopy(items)) 
0

рандомизировать в OrderedDict вы можете выполните следующие действия:

od = collections.OrderedDict([('This is the first key', ['foo', 'baz']), ('And the second key', ['buz', 'baz']), ('Finally the third key', ['bar', 'foo'])]) 
items = od.items() 
random.shuffle(items) 
odrnd = collections.OrderedDict(items) 
ornd 
OrderedDict([('Finally the third key', ['bar', 'foo']), ('This is the first key', ['foo', 'baz']), ('And the second key', ['buz', 'baz'])]) 
0
import random 
from collections import defaultdict, OrderedDict 

randomizedSamplesDict = defaultdict(list) 
for category, samples in samplesDict.iteritems(): 
    # samples is an OrderedDict object 
    keys = samples.keys() 
    random.shuffle(keys) 
    tempOrderedDict = OrderedDict() 
    for k in keys: 
    tempOrderedDict[k] = samples[k] 
    randomizedSamplesDict[category] = tempOrderedDict 

return randomizedSamplesDict 
Смежные вопросы