2013-08-15 2 views
1

Я хотел бы взять список словарей и создать новый список перестановок в определенном формате.Создание перестановок списка словарей

Например, у меня есть список ниже со словарями в нем. Я хотел бы создать все возможные списки, используя эти элементы в определенном формате: (например, result = [dict типа A, dict типа B, dict типа B, тип C, тип C, dict типа D, dict типа E, dict типа F]), где два элемента типа B не могут быть равными, а два элемента типа C не могут быть равны. Я буду обрабатывать большой набор элементов, поэтому все советы по обработке перестановок будут более эффективными.

{'Items':[ 
{'Name':'name10','Type':'A','measure1':20,'measure2':20}, 
{'Name':'name20','Type':'A','measure1':25,'measure2':30}, 
{'Name':'name30','Type':'B','measure1':15,'measure2':40}, 
{'Name':'name40','Type':'B','measure1':20,'measure2':50}, 
{'Name':'name50','Type':'B','measure1':25,'measure2':60}, 
{'Name':'name60','Type':'C','measure1':15,'measure2':70}, 
{'Name':'name70','Type':'C','measure1':20,'measure2':80}, 
{'Name':'name80','Type':'C','measure1':25,'measure2':90}, 
{'Name':'name90','Type':'D','measure1':10,'measure2':30}, 
{'Name':'name85','Type':'D','measure1':15,'measure2':30}, 
{'Name':'name75','Type':'E','measure1':53,'measure2':30}, 
{'Name':'name65','Type':'E','measure1':10,'measure2':30}, 
{'Name':'name55','Type':'F','measure1':56,'measure2':10}, 
{'Name':'name45','Type':'F','measure1':10,'measure2':20} 
]} 
+0

Возможно, что-то подобное может помочь? http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.permutation.html –

+0

Можете ли вы дать лучший пример того, как вы хотите, чтобы это выглядело? Что-то вроде '{" A ": [{" Name ":" name10 ", {" measure1 ":" 20 "}, {" Name ":" name20 ", {" measure1 ":" 30 "}]}'? – TankorSmash

+0

Я не понимаю, в какие перестановки входят. Вы просто удаляете/объединяете дубликаты? – roippi

ответ

0

Допустим, что ваш словарь Items в переменной x:

x_set = set((i['Name'], i['Type'], i['measure1'], i['measure2']) for i in x['Items']) 
items = [{'Name': i[0], 'Type': i[1], 'measure1': i[2], 'measure2': i[3]} for i in sorted(x_set)] 
new_x = {'Items': items} 

Было бы хорошо, чтобы просто взять множество() словарей, но это не возможно в Python. Словари должны были быть распакованы в кортежи и переупакованы в словари.

Для обработки больших наборов предметов рассмотрите возможность их разбиения на «осколки» на основе имени или типа.

+0

то, что я делаю сейчас, заключается в следующем: разбивка большого списка dicts на меньшие списки dicts, разделенных типом, с помощью 'a_s = filter (lambda (d): d [' Type '] ==' A ', listDict) ', а затем перебираем каждый из них с помощью циклов, например:' для f вначале: для s во втором: для t в третьем: result.append ([f, s, t]) ', а затем добавив все результаты от циклов for к моему результату. – user99106

+0

Да, это то, что я имел в виду, разбивая их на осколки/группы по типу. –

+0

Если это ответили на ваш вопрос, отметьте это как «Принято». Благодаря! –

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