在 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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 21:42:20  来源:igfitidea点击:

Iterate over OrderedDict in Python

pythonpython-3.xdictionarypython-3.3ordereddict

提问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