У меня есть следующий OrderedDict:
OrderedDict([('r', 1), ('s', 1), ('a', 1), ('n', 1), ('y', 1)])
Это фактически представляет собой частоту буквы в слове.
В первом шаге - я бы взял последние два элемента, чтобы создать объединенный кортеж, подобный этому;
pair1 = list.popitem()
pair2 = list.popitem()
merge_list = (pair1[0],pair2[0])
new_pair = {}
new_pair[merge_list] = str(pair1[1] + pair2[1])
list.update(new_pair);
Это создало для меня следующий OrderedList:
OrderedDict([('r', 1), ('s', 1), ('a', 1), (('y', 'n'), '2')])
Я хотел бы теперь перебирать элементы, каждый раз принимая последние три и решая на основе нижней суммы значений, что является объединенным объектом.
Например, приведенный выше список будет выглядеть следующим образом:
OrderedDict([('r', 1), (('s', 'a'), '2'), (('y', 'n'), '2')])
но выше было:
OrderedDict([ ('r', 1), ('s', 2), ('a', 1), (('y', 'n'), '2')])
Результат:
OrderedDict([('r', 1), ('s', 2), (('a','y', 'n'), '3')])
поскольку я хочу, чтобы левые имели меньшее значение
Я попытался сделать это сам, но не понял, как итерации от конца до начала над OrderedDict.
Как я могу это сделать?
EDITED Отвечая на комментарий:
Я получаю словарь частоты буквы в предложении:
{ 's':1, 'a':1, 'n':1, 'y': 1}
и нужно создать из него дерево хаффмана.
например:
((s,a),(n,y))
Я использую python 3.3