python list添加字典中list和字典在内存占用上有哪些区别

Python标准类型的比较原则:字典VS列表(元组) - Python - 伯乐在线
& Python标准类型的比较原则:字典VS列表(元组)
昨天看《核心编程》发现了一个鲜为人知的知识点,在Python中的字典比较和列表比较的策略竟然不相同,下面做具体分析。
字典比较原则
&&& dict1 = {}
&&& dict2 = {'host':'earth','port':80}
&&& cmp(dict1, dict2)
&&& dict1['host'] = 'earth'
&&& cmp(dict1,dict2)
&&& dict1 = {}&&& dict2 = {'host':'earth','port':80}&&& cmp(dict1, dict2)-1&&& dict1['host'] = 'earth'&&& cmp(dict1,dict2)-1
第一个比较中,dict1比dict2小,因为dict2有更多的元素(2个vs.0个)。在向dict1添加一个元素后,dict1仍然比dict2小(2个vs.1个),虽然添加的元素在dict2中也存在。
&&& dict1['port'] = 8080
&&& cmp(dict1, dict2)
&&& dict1['port'] = 80
&&& cmp(dict1, dict2)
&&& dict1['port'] = 8080&&& cmp(dict1, dict2)1&&& dict1['port'] = 80&&& cmp(dict1, dict2)0
在向dict1添加第二个元素后,两个字典的长度相同,所以用键比较大小。这时键相等,则通过它们的值比较大小。键’host’的值相同,对于键’port’,dict1中值比dict2中的值大(8080 vs. 80)。当把dict2中’port’的值设成和dict1中的值一样,那么两个字典相等:它们有相同的大小、相同的键、相同的值,所以cmp()返回值是0。
&&& dict1['port'] = 'tcp'
&&& cmp(dict1, dict2)
&&& dic2['port'] = 'udp'
&&& cmp(dict1,dict2)
&&& dict1['port'] = 'tcp'&&& cmp(dict1, dict2)1&&& dic2['port'] = 'udp'&&& cmp(dict1,dict2)-1
当向两个字典中的仍和一个添加新元素时,这个字典马上会成为大的那个字典,就像例子中的dict1一样。向dict2添加键-值对后,因为两个字典的长度又相等了,会继续比较它们的键和值。
&&& cdict = {'fruits':1}
&&& ddict = {'fruits':1}
&&& cmp(cdict,ddict)
&&& cdict['oranges'] = 0
&&& ddict['apples'] = 0
&&& cmp(cdict, ddict)
&&& cdict = {'fruits':1}&&& ddict = {'fruits':1}&&& cmp(cdict,ddict)0&&& cdict['oranges'] = 0&&& ddict['apples'] = 0&&& cmp(cdict, ddict)14
上面的例子表明cmp()可以返回除-1、0、1外的其他值。
字典比较总结
字典比较的算法按照以下顺序进行:
(1)比较字典长度
如果字典的长度不同,那么用 cmp(dict1, dict2) 比较大小时,如果字典 dict1 比 dict2 长,cmp()返回正值,如果 dict2 比 dict1 长,则返回负值。也就是说,字典中的键的个数越多,这个字典就越大,即:
len(dict1) & len(dict2) ==& dict1 & dict2
(2)比较字典的键
如果两个字典的长度相同,那就按字典的键比较;键比较的顺序和 keys()方法返回键的顺序相同。 (注意: 相同的键会映射到哈希表的同一位置,这保证了对字典键的检查的一致性。) 这时,如果两个字典的键不匹配时,对这两个(不匹配的键)直接进行比较。当 dict1 中第一个不同的键大于 dict2 中第一个不同的键,cmp()会返回正值。
(3)比较字典的值
如果两个字典的长度相同而且它们的键也完全匹配,则用字典中每个相同的键所对应的值进行比较。一旦出现不匹配的值,就对这两个值进行直接比较。若 dict1 比 dict2 中相同的键所对应的值大,cmp()会返回正值。
(4)完全匹配
到此为止,即,每个字典有相同的长度、相同的键、每个键也对应相同的值,则字典完全匹配,返回 0 值。
列表比较原则
&&& list1,list2 = [123,'xyz'],[456,'abc']
&&& cmp(list1, list2)
&&& cmp(list2, list1)
&&& list3 = list2 + [789]
[456,'abc',789]
&&& cmp(list2,list3)
123456789101112
&&& list1,list2 = [123,'xyz'],[456,'abc']&&& cmp(list1, list2)-1&&&&&& cmp(list2, list1)1&&& list3 = list2 + [789]&&& list3[456,'abc',789]&&&&&& cmp(list2,list3)-1
当我们比较list1和list2时,list1和list2逐项比较。第一个比较操作发生在两个列表的第一个元素之间,比如说,123与456比较,因为123如果比较的值相等,那么两个序列的下一个值继续比较,知道不相等的情况出现,或者到达较短的一个序列的末尾。在这种情况下,长的序列被认为是较大的。这就是为什么上面list2元组类型的比较也是用这种算法。
列表比较总结
列表比较的算法按照以下顺序进行:
(1)对两个列表的元组进行比较
(2)如果比较的元素是同类型的,则比较其值,返回结果。
(3)如果两个元素不是同一种类型,则检查他们是否是数字。
a.如果是数字,执行必要的数字强制类型转换,然后比较。
b.如果有一方的元素是数字,则另一方的元素“大”(数字是“最小的”)。
c.否则,通过类型名字的字母顺序进行比较。
a.如果是数字,执行必要的数字强制类型转换,然后比较。b.如果有一方的元素是数字,则另一方的元素“大”(数字是“最小的”)。c.否则,通过类型名字的字母顺序进行比较。
(4)如果有一个列表首先到达末尾,则另一个长一点的列表“大”。
(5)如果我们用尽了两个列表的元素而且所有的元素都是相等的,那么结果就是个平局,就是说返回一个0。
列表(元组)的比较原则:先大小后长短。
字典的比较原则:先长短,再键,再值。
《Python核心编程(第二版)》
可能感兴趣的话题
o 136 回复
关于 Python 频道
Python频道分享 Python 开发技术、相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线微信公众号:centoscn
python字典操作用法总结
基本语法:
dict = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'}
字典中包含列表:dict={'yangrong':['23','IT'],&xiaohei&:['22','dota']}
字典中包含字典:dict={'yangrong':{&age&:&23&,&job&:&IT&},&xiaohei&:{&'age':'22','job':'dota'&}}
可用命令:
root@yangrong:~# cd /python
root@yangrong:/python# python
Python 2.7.5+ (default, Sep 19 :49)
[GCC 4.8.1] on linux2
Type &help&,&copyright&, &credits& or &license& for moreinformation.
&&& import tab
d.__class__( & & & & d.__ge__( & & & & & &d.__len__( & & & & & d.__setitem__( & & & d.has_key( & & & & & d.setdefault(
d.__cmp__( & & & & & d.__getattribute__( &d.__lt__( & & & & & &d.__sizeof__( & & & &d.items( & & & & & & d.update(
d.__contains__( & & &d.__getitem__( & & & d.__ne__( & & & & & &d.__str__( & & & & & d.iteritems( & & & & d.values(
d.__delattr__( & & & d.__gt__( & & & & & &d.__new__( & & & & & d.__subclasshook__( &d.iterkeys( & & & & &d.viewitems(
d.__delitem__( & & & d.__hash__ & & & & & d.__reduce__( & & & &d.clear( & & & & & & d.itervalues( & & & &d.viewkeys(
d.__doc__ & & & & & &d.__init__( & & & & &d.__reduce_ex__( & & d.copy( & & & & & & &d.keys( & & & & & & &d.viewvalues(
d.__eq__( & & & & & &d.__iter__( & & & & &d.__repr__( & & & & &d.fromkeys( & & & & &d.pop( & & & & & & &
d.__format__( & & & &d.__le__( & & & & & &d.__setattr__( & & & d.get( & & & & & & & d.popitem( & & & & &
增加字典元素
&&& nameinfo={}
&&& nameinfo['a1']='yangrong' & #若字典里有a1主键,则覆盖原来的值,没有,则添加
&&& nameinfo
{'a1': 'yangrong'}
遍历字典主键与键值
&&& for k, value innameinfo.items():
... &print k,value
a1 yangrong
查看字典所有主键
&&& dict = {'ob1':'computer','ob2':'mouse', 'ob3':'printer'} &
&&& dict.keys()
['ob2', 'ob3', 'ob1']
判断字典中是否有该主键
&&& dict.keys()
['ob2', 'ob3', 'ob1']
&&& dict.has_key('ob2') & & #或'ob2' in dict
&&& dict.has_key('ob4')
也有人用循环方法来判断
for key in dict.keys():
但是这种方法毕竟不够简洁,
查看字典所有键值内容
&&& dict = {'ob1':'computer','ob2':'mouse', 'ob3':'printer'}
&&& dict.values()
['mouse', 'printer', 'computer']
列出所有项目
&&& dict.items()
[('ob2', 'mouse'), ('ob3', 'printer'),('ob1', 'computer')]
&&& dict.clear()
{'ob2': 'mouse', 'ob3': 'printer', 'ob1':'computer'}
&&& a=dict
{'ob2': 'mouse', 'ob3': 'printer', 'ob1':'computer'}
&&& b=dict.copy()
{'ob2': 'mouse', 'ob3': 'printer', 'ob1': 'computer'}
&&& cmp(a,b)
首先比较主键长度,然后比较键大小,然后比较键值大小,(第一个大返回1,小返回-1,一样返回0)
&&&dict={'yangrong':{&age&:&23&,&job&:&IT&},&xiaohei&:{&'age':'22','job':'dota'&}}
{'xiaohei':set([&'age':'22','job':'dota'&]), 'yangrong': {'age': '23', 'job':'IT'}}
&&& dict['xiaohei']=111 & & & &#修改一级字典
{'xiaohei': 111, 'yangrong': {'age': '23','job': 'IT'}}
&&& dict['yangrong']['age']=25 & &#修改二级字典
{'xiaohei': 111, 'yangrong': {'age': 25,'job': 'IT'}}
&&& dict={'yangrong':['23','IT'],&xiaohei&:['22','dota']}
&&&dict['xiaohei'][1]=&dota2& & & & & #修改字典中列表某项,1是代表列表中第2个字符串。
{'xiaohei': ['22', 'dota2'], 'yangrong':['23', 'IT']} &
删除字典元素
{'xiaohei': ['22', 'dota2'], 'yangrong':['23', 'IT']}
&&& del dict['xiaohei'] & & & & &#删除xiaohei键值
{'yangrong': ['23', 'IT']}
{'yangrong': ['23', 'IT']}
&&& del dict['yangrong'][1] & &#删除yangrong主键的每2字值
{'yangrong': ['23']}
删除整个字典
{'yangrong': ['23']}
&&& dict.clear() &#同del dict
将字符串切分为列表
&&& s=&hello world bye&
&&& s.split() & &#用于把有规律的文本,读取出来后,使用列表进行修改,再写入文件。
['hello', 'world', 'bye']
将列表转换为字符串
S.split(str, ' ') &#将string转list,以空格切分
存储字典(pickle序列化)
#需导入pickle模块 &import pickle
把字典内容存入文件
f=file('data.txt','wb') & #新建文件data.txt,'wb',b是打开块文件,对于设备文件有用
pickle.dump(a,f) & & &#把a序列化存入文件
把内容读入字典(反序列化)
a=open('data.txt','rb') & &#打开文件
print pickle.load(a) & & &#把内容全部反序列化
本文出自 &此心安处是吾乡& 博客,请务必保留此出处http://yangrong./4007
------分隔线----------------------------

我要回帖

更多关于 python 字典嵌套 list 的文章

 

随机推荐