Ⅰ python中的OrderedDict与dict:适合工作的工具--第二篇
Python入门 OrderedDict
OrderedDict 是 Python 中的一个字典子类,它保留了键值对插入的顺序。在进行迭代时,会按照原始顺序遍历所有项目。如果更新现有键的值,顺序保持不变;如果删除项目并重新插入,则该项目将添加到字典末尾。
作为字典子类,OrderedDict 继承了常规字典的所有方法。此外,它还具有其他功能,将在后续教程中介绍。在此节中,将学习如何在代码中创建和使用有序字典。
创建有序字典对象
创建有序字典对象的第一步是从 collections 模块导入类。有几种创建有序字典的方法,与创建常规字典对象的方式相似。例如,可以通过实例化不带参数的类来创建一个空的对象:
创建一个空的有序字典,无需向构造函数提供参数。
通过在方括号([])中提供键并将值分配给该键,可以将键值对添加到字典中。引用时,将获得一个迭代的键值对,这些键值对按插入到字典中的顺序保存项目。
还可以将项目的可迭代项作为参数传递给构造函数:
当使用序列时,所得有序字典中各项的顺序与输入序列中各项的原始顺序匹配。如果使用列表、元组或集合,则创建之前项的最终顺序是未知的。
如果您使用常规字典作为有序字典对象的初始化程序,并且使用的是 Python 3.6 或更高版本,则会遵循以下行为:
有序字典中的项目顺序与原始字典中的顺序匹配。另一方面,如果使用的 Python 版本低于 3.6,则项目顺序是未知的。
从 Python 3.6 开始,函数保留调用中传递的关键字参数的顺序。因此,有序字典中各项的顺序与将关键字参数传递给构造函数的顺序匹配。在早期版本中,该顺序是未知的。
最后,有序字典还提供了 fromkeys() 方法,可以从可迭代的键创建一个新的字典,并将所有值设置为一个公共值:
使用键列表作为起点创建有序字典。第二个参数提供单个值给字典中的所有项目。
管理物品有序字典
由于有序字典是可变数据结构,因此可以对其实例执行变异操作。可以插入新项目、更新和删除现有项目等。如果将新项目插入现有的有序字典中,则项目将添加到词典末尾。
删除一个项目并插入同一项目的新实例,则新项目将添加到基础词典的末尾。
重新分配或更新有序字典对象中现有键值对的值,则键将保持其位置但会获得新值。同样,如果使用 .update() 方法修改现有键值对的值,则字典会记住键的位置并为其分配更新后的值。
遍历有序字典
就像一般的字典一样,可以使用多种工具和技术迭代有序字典的对象。可以直接按键迭代,或者使用字典的方法,如 .items()、.keys() 和 .values():
第一个 for 循环直接遍历键的键。其他三个循环使用字典方法遍历的项目、键和值。
以相反的顺序迭代 reversed()
自 Python 3.5 以来,有序字典支持使用 reversed() 进行反向迭代。此功能已添加到 Python 3.8 的常规字典中。因此,如果代码使用它,则后向兼容性受到常规字典的更多限制。
可以使用 reversed() 对有序字典的项目、键和值进行反向迭代:
本示例中的每个循环都用于 reversed() 以相反的顺序遍历有序字典的不同元素。
常规字典还支持反向迭代。但在低于 3.8 的 Python 版本中尝试使用常规 dict 对象的 reversed() 会得到 TypeError:
如果需要以相反的顺序遍历字典中的项目,那么有序字典是一个很好的选择。使用常规字典会降低后向兼容性,因为直到 Python 3.8 才将反向迭代添加到常规字典中。
Ⅱ Python中list,tuple,dict,set的区别和用法
python中list,tuple,dict,set是最常用的集合类型。
list列表,相当于一个数组,不过list的长度是自动变化的而且列表元素自由的,不必每个元素都是同一种类型。它的简洁的定义方式是a=[]。有序组合
tuple也是一个组合。不过tuple在定义好之后就不能再变化。它的简洁的定义方式是a=1,3也可以是a=(1,3).有序组合。
dict是字典类型。也就是键值对类型。键名不可以重复,并且不可以变化(字符串就符合这个要求,常用字符串作为键名)。它的简洁的定义方式是a={}.无序组合(意思就是你无法按照添加的顺序对他进行遍历)。
set是set类型(不好翻译,用的也少)。也是一个无序的组合,元素是互斥的,也就不会出现相同的元素。可以把一个序列转换成无重复元素的set.无序组合。
以下是使用的示例代码。
a_tuple=(1,3423,'34')
a_list=[12,12.34,'sds']
a_dict={'key1':1,'key2':2}
a_set=set('2323')
fortina_tuple:
print('%sintuple'%t)
print('*'*10)
forlina_list:
print('%sinlist'%l)
print('*'*10)
fork,vina_dict.items():
print('key=%s,value=%sindict'%(k,v))
print('*'*10)
forsina_set:
print('%sinset'%s)
print('*'*10)
不明白可追问。
Ⅲ python字典是否有序
默认情况下Python的字典输出顺序是按照键的创建顺序。
字典的无序是指,不能人为重新排序。
比如说你按键值1,2,3,4的顺序创建的字典,只能由解析器按创建顺序,还是1,2,3,4的输出。
你无法控制它按照4,3,2,1的顺序输出,你也无法做到1,3,2,4的顺序。
而且这个输出顺序是也不是能真正按照创建顺序可以控的。
这里面有两个影响因素:
(1)键值的哈希碰撞,hash(key1) == hash(key2)时,向字典里连续添加的这个两个键的顺序是不可以控制的,也是无法做到连续的,后来的键会按算法调整到其它位置。
(2)字典空间扩容,当键的数量超过字典默认开的空间时,字典会做空间扩容,扩容后的键顺和创建顺序就会发生变化,不受人为控制。