比如
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}