在 Python 中迭代 OrderedDict
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20983252/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Iterate over OrderedDict in Python
提问by Dejell
I have the following OrderedDict:
我有以下几点OrderedDict:
OrderedDict([('r', 1), ('s', 1), ('a', 1), ('n', 1), ('y', 1)])
This actually presents a frequency of a letter in a word.
这实际上表示一个单词中一个字母的频率。
In the first step - I would take the last two elements to create a union tuple like this;
在第一步 - 我会用最后两个元素来创建一个这样的联合元组;
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);
This created for me the following OrderedList:
这为我创建了以下 OrderedList:
OrderedDict([('r', 1), ('s', 1), ('a', 1), (('y', 'n'), '2')])
I would like now to iterate over the elements, each time taking the last three and deciding based on the lower sum of the values what is the union object.
我现在想遍历元素,每次取最后三个并根据值的较低总和决定联合对象是什么。
For instance the above list will turn to;
例如上面的列表将转向;
OrderedDict([('r', 1), (('s', 'a'), '2'), (('y', 'n'), '2')])
but the above was:
但以上是:
OrderedDict([ ('r', 1), ('s', 2), ('a', 1), (('y', 'n'), '2')])
The result would be:
结果将是:
OrderedDict([('r', 1), ('s', 2), (('a','y', 'n'), '3')])
as I want the left ones to have the smaller value
因为我希望左边的值较小
I tried to do it myself but doesn't understand how to iterate from end to beginning over an OrderedDict.
我试图自己做,但不明白如何在 OrderedDict 上从头到尾迭代。
How can I do it?
我该怎么做?
EDITEDAnswering the comment:
编辑回答评论:
I get a dictionary of frequency of a letter in a sentence:
我得到一个句子中字母频率的字典:
{ 's':1, 'a':1, 'n':1, 'y': 1}
and need to create a huffman tree from it.
并且需要从中创建一个霍夫曼树。
for instance:
例如:
((s,a),(n,y))
I am using python 3.3
我正在使用 python 3.3
回答by Rob?
how to iterate from end to beginning over an OrderedDict ?
如何在 OrderedDict 上从头到尾迭代?
Either:
任何一个:
z = OrderedDict( ... )
for item in z.items()[::-1]:
# operate on item
Or:
或者:
z = OrderedDict( ... )
for item in reversed(z.items()):
# operate on item
回答by BartoszKP
Note that, as noted in the comments by adsmith, this is probably an instance of an XY Problemand you should reconsider your data structures.
请注意,正如adsmith的评论中所述,这可能是XY 问题的一个实例,您应该重新考虑您的数据结构。
Having said that, if you need to operate only on last three elements, then you don't need to iterate. For example:
话虽如此,如果您只需要对最后三个元素进行操作,那么您就不需要迭代了。例如:
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
Then having:
然后有:
letters = OrderedDict([('r', 1), ('s', 1), ('a', 1), ('n', 1), ('y', 1)])
print letters
mergeLastThree(letters)
print letters
mergeLastThree(letters)
print letters
Produces:
产生:
>>> 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')])
And to merge the whole structure completely you need to just:
要完全合并整个结构,您只需要:
print letters
while mergeLastThree(letters):
pass
print letters
Which gives:
这使:
>>> OrderedDict([('r', 1), ('s', 1), ('a', 1), ('n', 1), ('y', 1)])
OrderedDict([((('a', 's'), 'r'), '3'), (('y', 'n'), '2')])
>>>
回答by Zhongjun 'Mark' Jin
Simple example
简单的例子
from collections import OrderedDict
d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3
for key, value in d.items():
print key, value
Output:
输出:
a 1
b 2
c 3
回答by omerfarukdogan
You can iterate using enumerateand iteritems:
您可以使用enumerateand进行迭代iteritems:
dict = OrderedDict()
# ...
for i, (key, value) in enumerate(dict.iteritems()):
# Do what you want here
回答by Giorgos Myrianthous
For Python 3.x
对于 Python 3.x
d = OrderedDict( ... )
for key, value in d.items():
print(key, value)
For Python 2.x
对于 Python 2.x
d = OrderedDict( ... )
for key, value in d.iteritems():
printkey, value

