python 字典排序 字典序排序是什么意思

Python017

python 字典排序 字典序排序是什么意思,第1张

字典就是包含key:value对的集合

比如

L = [{"name": "zhangsan", "birth":19920208, "gender":"m"}, {"name": "lisi", "birth":19900609, "gender":"m"}, {"name": "wanghong", "birth":19950907, "gender":"f"}]

字典排序就是对列表进行排序后打印:

from operator import itemgetter

L = sorted(L,key=itemgetter('birth'),reverse=True)

for i in range(0,len(L)):

... print("Name: {:10} Gender: {:2} Birth: {}".format(L[i]["name"],L[i]["gender"],L[i]["birth"]))

添加键值对

首先定义一个空字典

>>>dic={}

直接对字典中不存在的key进行赋值来添加

>>>dic['name']='zhangsan'

>>>dic

{'name': 'zhangsan'}

如果key或value都是变量也可以用这种方法

>>>key='age'

>>>value=30

>>>dic[key]=value

>>>dic

{'age': 30. 'name': 'zhangsan'}

这里可以看到字典中的数据并不是按先后顺序排列的,如果有兴趣,可以搜一搜数据结构中的——哈希表

从python3.7开始,字典按照插入顺序,实现了有序。修改一个已存在的key的值,不影响顺序,如果删了一个key后再添加该key,该key会被添加至末尾。标准json库的dump(s)/load(s)也是有序的

还可以用字典的setdefault方法

>>>dic.setdefault('sex','male')

'male'

>>>key='id'

>>>value='001'

>>>dic.setdefault(key,value)

'001'

>>>dic

{'id': '001', 'age': 30. 'name': 'zhangsan', 'sex': 'male'}

并不是无序,是undefined。也就是说可能有序可能无序(不要对顺序做任何假设)。至于为什么数字表现得有序而字符串不是,因为数字在Python中的哈希值是特殊的。

多说点吧。Python的字典实现其实就是个哈希表(当然里面有一些优化),每次赋值其实就是计算key的哈希值然后放到哈希表的指定位置中。遍历的话就是从前向后遍历整个哈希表。这里不讲处理冲突,就说最简单的往一个空字典中插入两个值。

先看字符串的情况:

>>>hash('1') &7

0

>>>hash('2') &7

3

>>>hash('3') &7

2

>>>{'1': 1, '2': 2}

{'1': 1, '2': 2}

>>>{'2': 2, '3': 3}

{'3': 3, '2': 2}

可以看到因为同样对于字符串,第一个就是有序的,第二个就是无序的。为什么是

hash(object) &7

Python里就这么设计的嘛。要注意的是,Python中哈希值的生成是可以被影响的,所以上面字符串的哈希值可能会在不同的Python进程中发生变化,导致它们出现在字典中顺序的不同。

那对于数字,Python中数字的哈希值是特殊的:

>>>hash(1)

1

>>>hash(2)

2

>>>hash(3)

3

所以你会看到它们在字典中是有序的。

再次强调的一点是,不要对字典中key的顺序做任何的假设,它们可能因为哈希值的变化,CPython实现的变化而随时发生改变。如果需要一个保持key的顺序的字典类型,请用collections.OrderedDict,即使是在3.6中。

顺序变化的例子,3.5:

>>>{2: 2, 1: 1}

{1: 1, 2: 2}

3.6:

>>>{2: 2, 1: 1}

{2: 2, 1: 1}