2013-11-06 3 views
-2

У меня есть следующий словарь:Как использовать itertools для создания словарей всех перестановок данного словаря

test = OrderedDict({ 
     "one":1, 
     "two":2, 
     "three":3 
}) 

И я хочу иметь следующий результат:

{'three':3, 'two':2, 'one':1} 
{'three':3, 'one':1, 'two':2} 
{'two':2, 'three', 'one':1} 
{'two':2, 'one':1, 'three':3} 
{'one':1, 'three':3, 'two':2} 
{'one':1, 'two':2, 'three':3} 

Это все словари, которые могут быть сгенерированы с использованием перестановок на данном тесте dict.

На данный момент я могу только получить кортежи возможных перестановок с помощью следующей:

for perm in itertools.permutations(test): 
    print(perm) 

Выведет:

('three', 'two', 'one') 
('three', 'one', 'two') 
('two', 'three', 'one') 
('two', 'one', 'three') 
('one', 'three', 'two') 
('one', 'two', 'three') 

Как я могу использовать itertools получить словари с ключом/значений вместо кортежи?

EDIT: Изменен тест, чтобы быть OrderedDict

+2

Dicts не имеют никакого порядка, так это невозможно, если вы не используете 'OrderedDict'. –

+2

Словари ** не имеют порядка **; ваши «вариации» вывода - это одинаковое значение словаря. –

+0

Да, но тот же результат происходит с orderdict –

ответ

1

Хотя словари не имеют заказ вы можете получить перестановки в кортеже и превратить эти в OrderedDict:

>>> import itertools 
>>> import collections 
>>> for item in itertools.permutations(test.items()): 
...  print collections.OrderedDict(item) 
... 
OrderedDict([('three', 3), ('two', 2), ('one', 1)]) 
OrderedDict([('three', 3), ('one', 1), ('two', 2)]) 
OrderedDict([('two', 2), ('three', 3), ('one', 1)]) 
OrderedDict([('two', 2), ('one', 1), ('three', 3)]) 
OrderedDict([('one', 1), ('three', 3), ('two', 2)]) 
OrderedDict([('one', 1), ('two', 2), ('three', 3)]) 
+0

Спасибо, что работает отлично :) –

+0

@LT: хорошо, я рад, что это было полезно. Вы можете принять этот ответ, установив флажок слева. –

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