设为首页 收藏本站
查看: 1108|回复: 0

[经验分享] python学习笔记(五)之字典2

[复制链接]

尚未签到

发表于 2018-8-13 07:46:40 | 显示全部楼层 |阅读模式
  python学习笔记(五)之字典2
  编程实战中经常用到
  实例1:copy
  >> ad = {"name":"wtf","hig":"180"}
  >> bd = ad
  >> bd
  {'name': 'wtf', 'hig': '180'}

  >>>  4539954352

  >>>  4539954352
  说明:一个对象贴上两个标签,使用赋值,实现了所谓的“假装拷贝”。
  如果使用copy()
  >> cd = ad.copy()
  >> cd
  {'name': 'wtf', 'hig': '180'}

  >>>  4541831160
  说明:这次得到的cd于原来的ad是不同的。
  如果我修改cd,就应该对原来的ad不会造成什么影响,如下:
  >> cd["name"] = "didi"
  >> cd
  {'name': 'didi', 'hig': '180'}
  >> ad
  {'name': 'wtf', 'hig': '180'}
  如果我修改了bd,则ad也应该跟着改变的,如下:
  >> bd["name"] = "aaa"
  >> bd
  {'name': 'aaa', 'hig': '180'}
  >> ad
  {'name': 'aaa', 'hig': '180'}
  关于python中的浅拷贝与深拷贝
  浅拷贝
  实例2:元组中含有列表
  >> x = {"name":"wtf","lang":["python","java"]}
  >> type(x)
  <type 'dict'>
  >> y = x.copy()
  >> y
  {'lang': ['python', 'java'], 'name': 'wtf'}

  >>>  4529826624

  >>>  4529826344
  说明:y是从x拷贝过来的,两个在内存中是不同的对象。
  现在键“lang”的值是一个列表,为['python', 'java'],这里用remove()这个列表方法删除其中的一个元素“java”。删除之后,这个列表就变为:['python'],操作如下:
  >> y[&quot;lang&quot;].remove(&quot;java&quot;)
  >> y
  {'lang': ['python'], 'name': 'wtf'}
  按照实例1,它是另一个对象,x应该是不会改变的,则:
  >> x
  {'lang': ['python'], 'name': 'wtf'}
  x竟然改变啦!!
  下面我们使用id()来分析下:

  >>>  4529826624

  >>>  4529826344
  说明:x,y确实对应着两个不同的对象,但是这个对象(字典)是由两个键值组成的,其中一个键的值是列表。

  >>>  4529661856

  >>>  4529661856
  说明:列表竟然是同一个对象!!
  原因解释:
  python在所执行的复制动作中,如果是基本类型的对象(专值数字和字符串),就在内存中重新建个窝;如果不是基本类型的,就不建新窝,而是用标签引用原来的窝。
  深拷贝
  python中的深拷贝就是使用import来导入一个模块。
  实例3:
  >> import copy
  >> z = copy.deepcopy(x)
  >> z
  {'lang': ['python'], 'name': 'wtf'}

  >>>  4529661856

  >>>  4529828136
  说明:果然是新建了一个窝,而不是引用啦!
  此时,如果修改其中一个,应该不影响另一个。
  实例4:
  >> x
  {'lang': ['python'], 'name': 'wtf'}
  >> x[&quot;lang&quot;].remove(&quot;python&quot;)
  >> x
  {'lang': [], 'name': 'wtf'}
  >> z
  {'lang': ['python'], 'name': 'wtf'}
  clear
  说明:在交互模式下,用help()是一个很好的习惯。
  clear是一个清空字典中所有元素的操作
  实例5:
  >> x
  {'lang': [], 'name': 'wtf'}
  >> x.clear()
  >> x
  {}
  说明:将字典清空,得到一个“空”字典。
  del()是将字典删除,内存中就没有它了,不是为“空”。
  实例6:
  >> y
  {'lang': [], 'name': 'wtf'}
  >> del(y)
  >> y
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  NameError: name 'y' is not defined
  get,setdefault
  get的含义是:
  help(dict.get)
  get(...)
  D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.
  说明:“if k in D”,就返回其值
  实例7:
  >> d
  {'lang': 'python'}
  >> d.get(&quot;lang&quot;)
  'python'
  说明:dict.get()就是要得到字典中某个键的值,其实,
  >> d[&quot;lang&quot;]
  'python'
  也可以得到。
  但是,如果是不存在的值,则:
  实例8:
  >> print d.get(&quot;name&quot;)
  None
  >> d[&quot;name&quot;]
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  KeyError: 'name'
  说明:这就是dict.get()与dict[&quot;key]的区别。
  前面有一个半句话,如果键不在字典中,会返回none,这是一种情况。还可以这样:
  实例9:
  >> d
  {'lang': 'python'}
  >> newd = d.get(&quot;name&quot;,&quot;didi&quot;)
  >> newd
  'didi'
  >> d
  {'lang': 'python'}
  说明:以d.get(&quot;name&quot;,&quot;didi&quot;)的方式,如果不能得到键&quot;name&quot;的值,就返回后面指定的值&quot;didi&quot;。这就是文档中D.get(k[,d]) -> D[k] if k in D, else d.的含义。这样做,并没有影响原来的字典。
  setdefault
  help(dict.setdefault)
  含义:D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
  说明:与get的功能上有相似的地方。
  实例10:
  >> d
  {'lang': 'python'}
  >> d.setdefault(&quot;lang&quot;)
  'python'
  >> d.setdefault(&quot;name&quot;,&quot;didi&quot;)
  'didi'
  >> d
  {'lang': 'python', 'name': 'didi'}
  说明:没有&quot;name&quot;这个键,于是就返回d.setdefault(&quot;name&quot;,&quot;didi&quot;)指定的值&quot;didi&quot;,并且将键值对&quot;name&quot;:&quot;didi&quot;添加到原来的字典中。
  如果是这样的:
  实例11:
  >> d.setdefault(&quot;web&quot;)
  >> print d
  {'lang': 'python', 'web': None, 'name': 'didi'}
  说明:键&quot;web&quot;的值变成了“None”
  items/iteritems,keys/iterkeys,values/itervalues
  说明:在pytho3中不再需要:iteritems,iterkeys,itervalues
  ➜  ~ python --version
  Python 2.7.10
  >> help(dict.items)
  items(...)
  D.items() -> list of D's (key, value) pairs, as 2-tuples
  实例12:
  >> dd = {&quot;name&quot;:&quot;wtf&quot;,&quot;lang&quot;:&quot;java&quot;,&quot;web&quot;:&quot;www.datagrand.com&quot;}
  >> dd_kv = dd.items()
  >> dd_kv
  [('lang', 'java'), ('web', 'www.datagrand.com'), ('name', 'wtf')]
  说明:这种操作对循环有大用。
  >> help(dict.iteritems)
  iteritems(...)
  D.iteritems() -> an iterator over the (key, value) items of D
  实例13:
  >> dd
  {'lang': 'java', 'web': 'www.datagrand.com', 'name': 'wtf'}
  >> dd_iter = dd.iteritems()
  >> type(dd_iter)
  <type 'dictionary-itemiterator'>
  >> dd_iter
  <dictionary-itemiterator object at 0x106f56a48>
  >> list(dd_iter)
  [('lang', 'java'), ('web', 'www.datagrand.com'), ('name', 'wtf')]
  说明:得到的dd_iter的类型,是一个“dictionary-itemiterator”类型,不过这种迭代器类型的数据不能直接输出,必须用list()转换一下,才能看到里面的真面目。
  另外两组与item/iteritems含义相似。
  pop,popitem
  说明:在列表中,有关删除列表中元素的函数pop和remove,这两个的区别在于:list.remove(x)用来删除指定的元素,而list.pop用来删除指定索引的元素,如果不提供索引值,就默认删除最后一个。
  在字典中,也有删除键值对的函数
  >> help(dict.pop)
  pop(...)
  D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
  If key is not found, d is returned if given, otherwise KeyError is raised
  其中,D.pop(k[,d])是以字典的键为参数,删除指定键的键值对。
  实例14:
  >> dd
  {'lang': 'java', 'web': 'www.datagrand.com', 'name': 'wtf'}
  >> dd.pop(&quot;name&quot;)
  'wtf'
  >> dd
  {'lang': 'java', 'web': 'www.datagrand.com'}
  值得注意的是,字典中pop函数的参数是不能省略的,这跟列表中的那个pop有所不同。
  实例15:
  >> dd.pop()
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  TypeError: pop expected at least 1 arguments, got 0
  如果删除字典中没有的键值对,也会报错:
  实例16:
  >> dd
  {'lang': 'java', 'web': 'www.datagrand.com'}
  >> dd.pop(&quot;name&quot;)
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  KeyError: 'name'
  popitem
  >> help(dict.popitem)
  popitem(...)
  D.popitem() -> (k, v), remove and return some (key, value) pair as a
  2-tuple; but raise KeyError if D is empty.
  说明:D.popitem()与list.pop()有相似之处。
  实例17:
  >> dd
  {'lang': 'java', 'web': 'www.datagrand.com'}
  >> dd.popitem()
  ('lang', 'java')
  >> dd
  {'web': 'www.datagrand.com'}
  说明:随机删除一对
  >> dd.popitem()
  ('web', 'www.datagrand.com')
  >> dd
  {}
  已经把字典变成空,再删:
  >> dd.popitem()
  Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
  KeyError: 'popitem(): dictionary is empty'
  说明:告知没有东西可删除啦
  update
  说明:更新字典
  >> help(dict.update)
  update(...)
  D.update([E, ]**F) -> None.  Update D from dict/iterable E and F.
  If E present and has a .keys() method, does:     for k in E: D[k] = E[k]
  If E present and lacks .keys() method, does:     for (k, v) in E: D[k] = v
  In either case, this is followed by: for k in F: D[k] = F[k]
  说明:这个函数没有返回值,或者说返回值是none,它的作用就是更新字典。其参数可以是字典或者某种可迭代的对象。
  实例18:
  >> d1 = {&quot;lang&quot;:&quot;python&quot;}
  >> d2 = {&quot;name&quot;:&quot;wtf&quot;}
  >> d1.update(d2)
  >> d1
  {'lang': 'python', 'name': 'wtf'}
  >> d2
  {'name': 'wtf'}
  说明:字典d2更新入了d1那个字典,于是d1中就多了一些内容,把d2的内容包含了进来,d2内容保持不变。
  还可以以下面这种方式更新:
  实例19:
  >> d2
  {'name': 'wtf'}
  >> d2.update([(&quot;song&quot;,&quot;xingxing&quot;),(&quot;web&quot;,&quot;www.baidu.com&quot;)])
  >> d2
  {'web': 'www.baidu.com', 'name': 'wtf', 'song': 'xingxing'}
  has_key
  说明:目前仅在python2中存在,python3中将其取消了
  这个函数的功能就是判断字典中是否存在某个键,跟&quot;k in d&quot;类似。
  >> help(dict.has_key)
  has_key(...)
  D.has_key(k) -> True if D has a key k, else False
  实例20:
  >> d2
  {'web': 'www.baidu.com', 'name': 'wtf', 'song': 'xingxing'}
  >> d2.has_key(&quot;web&quot;)
  True

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-550892-1-1.html 上篇帖子: CentOS 6.9编译安装Python-2.7.10 下篇帖子: python中使用time时间模块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表