我有以下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')])
我现在想迭代元素,每次都取最后三个元素,并根据值的较低总和决定什么是union对象。
例如,上面的列表将转向;
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
答案 0 :(得分:39)
简单示例
from collections import OrderedDict
d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3
for key, value in d.items():
print key, value
输出:
a 1
b 2
c 3
答案 1 :(得分:11)
如何在OrderedDict上从头到尾迭代?
或者:
z = OrderedDict( ... )
for item in z.items()[::-1]:
# operate on item
或者:
z = OrderedDict( ... )
for item in reversed(z.items()):
# operate on item
答案 2 :(得分:4)
您可以使用enumerate
和iteritems
进行迭代:
dict = OrderedDict()
# ...
for i, (key, value) in enumerate(dict.iteritems()):
# Do what you want here
答案 3 :(得分:2)
对于Python 3.x
d = OrderedDict( ... )
for key, value in d.items():
print(key, value)
对于Python 2.x
d = OrderedDict( ... )
for key, value in d.iteritems():
print key, value
答案 4 :(得分:1)
请注意,正如adsmith的评论中所述,这可能是XY Problem的一个实例,您应该重新考虑您的数据结构。
话虽如此,如果你只需要操作最后三个元素,那么你就不需要迭代了。例如:
MergeInfo = namedtuple('MergeInfo', ['sum', 'toMerge1', 'toMerge2', 'toCopy'])
def mergeLastThree(letters):
if len(letters) < 3:
return False
last = letters.popitem()
last_1 = letters.popitem()
last_2 = letters.popitem()
sum01 = MergeInfo(int(last[1]) + int(last_1[1]), last, last_1, last_2)
sum12 = MergeInfo(int(last_1[1]) + int(last_2[1]), last_1, last_2, last)
sum02 = MergeInfo(int(last[1]) + int(last_2[1]), last, last_2, last_1)
mergeInfo = min((sum01, sum12, sum02), key = lambda s: s.sum)
merged = ((mergeInfo.toMerge1[0], mergeInfo.toMerge2[0]), str(mergeInfo.sum))
letters[merged[0]] = merged[1]
letters[mergeInfo.toCopy[0]] = mergeInfo.toCopy[1]
return True
然后:
letters = OrderedDict([('r', 1), ('s', 1), ('a', 1), ('n', 1), ('y', 1)])
print letters
mergeLastThree(letters)
print letters
mergeLastThree(letters)
print letters
产地:
>>> OrderedDict([('r', 1), ('s', 1), ('a', 1), ('n', 1), ('y', 1)])
OrderedDict([('r', 1), ('s', 1), (('y', 'n'), '2'), ('a', 1)])
OrderedDict([('r', 1), (('a', 's'), '2'), (('y', 'n'), '2')])
要完全合并整个结构,您需要:
print letters
while mergeLastThree(letters):
pass
print letters
给出了:
>>> OrderedDict([('r', 1), ('s', 1), ('a', 1), ('n', 1), ('y', 1)])
OrderedDict([((('a', 's'), 'r'), '3'), (('y', 'n'), '2')])
>>>