字典与OrderedDict之间的差异

问题描述 投票:12回答:5

我正在尝试获得排序的字典。但是mydictorddict之间的项目顺序似乎没有变化。

from collections import OrderedDict

mydict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

orddict = OrderedDict(mydict)

print(mydict, orddict)

# print items in mydict:
print('mydict')
for k, v in mydict.items():
    print(k, v)

print('ordereddict')
# print items in ordered dictionary
for k, v in orddict.items():
    print(k, v)


# print the dictionary keys
# for key in mydict.keys():
#     print(key)


#  print the dictionary values
# for value in mydict.values():
#     print(value)
python python-3.x dictionary ordereddictionary
5个回答
10
投票

OrderedDict保留插入的订单元素:

>>> od = OrderedDict()
>>> od['c'] = 1
>>> od['b'] = 2
>>> od['a'] = 3
>>> od.items()
[('c', 1), ('b', 2), ('a', 3)]
>>> d = {}
>>> d['c'] = 1
>>> d['b'] = 2
>>> d['a'] = 3
>>> d.items()
[('a', 3), ('c', 1), ('b', 2)]

因此OrderedDict不会为您order元素,而是保留您赋予它的顺序。

如果您想对字典进行“排序”,则可能需要

>>> sorted(d.items())
[('a', 1), ('b', 2), ('c', 3)]

10
投票

Python 3.7起,新的改进是:

dict对象的插入顺序保留特性已被声明为Python语言规范的正式组成部分。

这意味着不再真正需要OrderedDict。它们几乎相同。


但是,有些小细节需要考虑...

但是Python 3.7+ dictOrderedDict之间有区别,在这里证明:

from collections import OrderedDict

d = {'b': 1, 'a': 2}
od = OrderedDict([('b', 1), ('a', 2)])

# they are equal with content and order
assert d == od
assert list(d.items()) == list(od.items())
assert repr(dict(od)) == repr(d)

很明显,两个对象的字符串表示形式有所不同,dict对象的形式更自然,更紧凑。

str(d)  # {'b': 1, 'a': 2}
str(od) # OrderedDict([('b', 1), ('a', 2)])

关于两者之间的不同方法,可以用集合论来回答这个问题:

d_set = set(dir(d))
od_set = set(dir(od))
od_set.difference(d_set)
# {'__dict__', '__reversed__', 'move_to_end'}

这意味着OrderedDict至少具有dict没有内置的两个功能,但此处显示了解决方法:

# 1) OrderedDict can be reversed (but then what?)
reversed(od)
# <odict_iterator at 0x7fc03f119888>
reversed(d)
# TypeError: 'dict' object is not reversible
# better way to reverse a dict
dict(reversed(list(d.items())))  # {'a': 2, 'b': 1}

# 2) OrderedDict has 'move_to_end' method
od.move_to_end('b')  # now it is: OrderedDict([('a', 2), ('b', 1)])
# dict does not, but similar can be done with
d['b'] = d.pop('b')  # now it is: {'a': 2, 'b': 1}

3
投票

有序词典就像常规词典一样,但是它们记住插入项目的顺序。在有序字典上进行迭代时,将按其键首次添加的顺序返回项目。

因此,它仅按添加到字典中的顺序进行排序>>

您可以通过以下键来构建OrderedDict订单,

orddict = OrderedDict(sorted(mydict.items(), key = lambda t: t[0]))

或简单地如评论中提到的@ShadowRanger

orddict = OrderedDict(sorted(d.items()))

如果要按值订购,

orddict = OrderedDict(sorted(mydict.items(), key = lambda t: t[1]))

8.3.5.1. OrderedDict Examples and Recipes中的更多信息


3
投票

[加上Brian的回答,OrderedDict确实很棒。这是为什么:


1
投票
© www.soinside.com 2019 - 2024. All rights reserved.