2.2.6 OrderedDict:记住向字典中增加键的顺序
OrderedDict是一个字典子类,可以记住其内容增加的顺序。
import collections
print ( 'Regular dictionary:' )
d = { }
d[ 'a' ] = 'A'
d[ 'b' ] = 'B'
d[ 'c' ] = 'C'
for k, v in d. items( ) :
print ( k, v)
print ( '\nOrderedDict:' )
d = collections. OrderedDict( )
d[ 'a' ] = 'A'
d[ 'b' ] = 'B'
d[ 'c' ] = 'C'
for k, v in d. items( ) :
print ( k, v)
常规dict并不跟踪插入顺序,迭代处理时会根据散列表中如何存储键来按顺序生成值,而散列表中键的存储会受一个随机值的影响,以减少冲突。OrderedDict中则相反,它会记住元素插入的顺序,并在创建迭代器时使用这个顺序。
运行结果:
Regular dictionary:
a A
b B
c C
OrderedDict:
a A
b B
c C
2.2.6.1 相等性
常规的dict在检查相等性时会查看其内容。OrderedDict还会考虑元素增加的顺序。
import collections
print ( 'dict :' , end= ' ' )
d1 = { }
d1[ 'a' ] = 'A'
d1[ 'b' ] = 'B'
d1[ 'c' ] = 'C'
d2 = { }
d2[ 'c' ] = 'C'
d2[ 'b' ] = 'B'
d2[ 'a' ] = 'A'
print ( d1 == d2)
print ( 'OrderedDict:' , end= ' ' )
d1 = collections. OrderedDict( )
d1[ 'a' ] = 'A'
d1[ 'b' ] = 'B'
d1[ 'c' ] = 'C'
d2 = collections. OrderedDict( )
d2[ 'c' ] = 'C'
d2[ 'b' ] = 'B'
d2[ 'a' ] = 'A'
print ( d1 == d2)
在这个例子中,由于两个有序字典由不同顺序的值创建,所有认为这两个有序字典是不同的。
运行结果:
dict : True
OrderedDict: False
2.2.6.2 重排
在OrderedDict中可以使用move_to_end()将键移至序列的起始或末尾位置来改变键的顺序。
import collections
d = collections. OrderedDict(
[ ( 'a' , 'A' ) , ( 'b' , 'B' ) , ( 'c' , 'C' ) ]
)
print ( 'Before:' )
for k, v in d. items( ) :
print ( k, v)
d. move_to_end( 'b' )
print ( '\nmove_to_end():' )
for k, v in d. items( ) :
print ( k, v)
d. move_to_end( 'b' , last= False )
print ( '\nmove_to_end(last=False):' )
for k, v in d. items( ) :
print ( k, v)
last参数会告诉move_to_end()要把元素移动为键序列的最后一个元素(参数值为True)或者第一个元素(参数值为False)。
运行结果:
Before:
a A
b B
c C
move_to_end():
a A
c C
b B
move_to_end(last=False):
b B
a A
c C