(五)字典<1>基础

1.字典的"键"唯一不可修改(与字符串一样),"值"可变:

>>> d={[1,2]:3}
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    d={[1,2]:3}
TypeError: unhashable type: 'list'
  • 字典是可变的,可以原地修改,而字符串和元组不行:
>>> ad={}
>>> id(ad)
50949832
>>> ad['name']='Jim Green'
>>> ad
{'name': 'Jim Green'}
>>> id(ad)
50949832

2.使用dict()转化为字典(传入的值必须符合'键-值'这样的内容):

  • 利用元组构建字典
# 如果单个列表有3个元素,也是会报错
>>> name=(['first','sina'],['second','51cto'])
>>> website=dict(name)
>>> website
{'second': '51cto', 'first': 'sina'}
>>> name=('sina.com','qq.com')
>>> website=dict(name)
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    website=dict(name)
ValueError: dictionary update sequence element #0 has length 8; 2 is required
>>> tuple3=(('name',20),)
>>> dict3=dict(tuple3)
>>> dict3
{'name': 20}
  • 或者dict()传入键-值:
>>> message=dict(name='Jim Green',age=20)
>>> message
{'name': 'Jim Green', 'age': 20}
  • 字典方法:dict.fromkeys()---传入可迭代对象和值,作出"多个键映射相同值的效果"
>>> help(dict.fromkeys)
Help on built-in function fromkeys:

fromkeys(iterable, value=None, /) method of builtins.type instance
    Returns a new dict with keys from iterable and values equal to value.

>>> iterable1="string"
>>> value1=dict.fromkeys(iterable1,'对应字符串')
>>> value1
{'n': '对应字符串', 'g': '对应字符串', 't': '对应字符串', 's': '对应字符串', 'r': '对应字符串', 'i': '对应字符串'}
>>> iterable2=[1,2,3,4]
>>> value2=dict.fromkeys(iterable2,'对应数字')
>>> value2
{1: '对应数字', 2: '对应数字', 3: '对应数字', 4: '对应数字'}
# fromkeys()的值只有一个,无法对应
>>> value2=dict.fromkeys(iterable2,('1','2','3','4'))
>>> value2
{1: ('1', '2', '3', '4'), 2: ('1', '2', '3', '4'), 3: ('1', '2', '3', '4'), 4: ('1', '2', '3', '4')}

3.字典不关心顺序,所以也就没有索引和切片这种东东,记住啦~~~

  • len(d),返回字典(d)中的键值对的数量:
>>> city_code={'suzhou': '0512', 'beijing': '011', 'shanghai': '012', 'tangshan': '0315'}
>>> len(city_code)
4

del d[key],删除字典(d)的键(key)项(将该键值对删除):

>>> del city_code['beijing']
>>> city_code
{'shanghai': '012', 'suzhou': '0512', 'tangshan': '0315'}

key in d,检查字典(d)中是否含有键为key的项:

>>> city_code
{'shanghai': '012', 'suzhou': '0512', 'tangshan': '0315'}
>>> 'shanghai' in city_code
True
>>> 'xiamen' in city_code
False

4.很"酷"的字典实现"格式化"功能:

>>> city_code={'hangzhou':"0521",'suzhou':"0639",'beijing':'010'}
# 键名添加到%s之间
>>> message='hangzhou is a beautiful city and its city code is %(hangzhou)s' % city_code
>>> message
'hangzhou is a beautiful city and its city code is 0521'
# 分别使用format和"%"
>>> dict1={'name':'Jim Green','age':20}
>>> "{name}'s age is {age}".format(**dict1)
"Jim Green's age is 20"
>>> "%(name)s's age is %(age)s" % dict1
"Jim Green's age is 20"
>>> 
  • 延伸到网页模板:
>>> temp="<html><head><title>%(lang)s</title><body><p>my name is %(name)s.</p></body></head></html>"
>>> message={'name':'Jim Green','lang':'python'}
>>> temp % message
'<html><head><title>python</title><body><p>my name is Jim Green.</p></body></head></html>'

5.python中,一个对象有两个标签(或者说两个变量)是很常见的:

>>> a=5
>>> b=a
>>> b
5
>>> id(a)
1774514096
>>> id(b)
1774514096
  • 假装拷贝和字典的copy()方法:
# 假装拷贝
>>> dict1={'name':'Jim Green','age':20}
>>> dict2=dict1
>>> dict2
{'age': 20, 'name': 'Jim Green'}
>>> id(dict1)
51571400
>>> id(dict2)
51571400
# 使用copy,结果发现内存地址不一样了
>>> dict3=dict1.copy()
>>> dict3
{'age': 20, 'name': 'Jim Green'}
>>> id(dict3)
50953672
  • python的"深拷贝"和'浅拷贝',看到再谷歌一下...

补充:

Help on class dict in module builtins:

class dict(object)
 |  dict() -> new empty dictionary
 # dict1=dict()
 # dict1={}
 |  dict(mapping) -> new dictionary initialized from a mapping object's
 |      (key, value) pairs
>>> list1=[('name','Jim Green'),('age',20)]
>>> dict1=dict(list1)
>>> dict1
{'age': 20, 'name': 'Jim Green'}
# 只要满足映射的关系即可
>>> tuple1=(['name','Jim Green'],['age',20],('breast',60))
>>> dict2=dict(tuple1)
>>> dict2
{'breast': 60, 'age': 20, 'name': 'Jim Green'}
 |  dict(iterable) -> new dictionary initialized as if via:
 |      d = {}
 |      for k, v in iterable:
 |          d[k] = v
# 见到这种处理方法,不要惊奇
>>> tuple1=(['name','Jim Green'],('age',20))
>>> d=dict()
>>> for k,v in tuple1:
         d[k]=v
>>> d
{'name': 'Jim Green', 'age': 20}
>>> tuple1=(['name','Jim Green'],('age',20))
# 平常是这么处理
>>> d=dict(tuple1)
>>> d
{'name': 'Jim Green', 'age': 20}
 |  dict(**kwargs) -> new dictionary initialized with the name=value pairs
 |      in the keyword argument list.  For example:  dict(one=1, two=2)
  • 浅拷贝和深拷贝
>>> x=dict(name='qiwsir',lang=['python','java','c'])
>>> y=x.copy()
>>> y
{'name': 'qiwsir', 'lang': ['python', 'java', 'c']}
# 地址不同,是两个对象
>>> id(x)
54001352
>>> id(y)
51343944
# y删除值为list元素,影响x
>>> y['lang'].remove('c')
>>> y
{'name': 'qiwsir', 'lang': ['python', 'java']}
>>> x
{'name': 'qiwsir', 'lang': ['python', 'java']}
# y重新赋值str元素,不影响x
>>> y['name']='laoqi'
>>> y
{'name': 'laoqi', 'lang': ['python', 'java']}
>>> x
{'name': 'qiwsir', 'lang': ['python', 'java']}
# x,y的lang键值为List类型,地址相同,指向同一个对象,一个变,另一个当然也变
>>> id(x['lang'])
53999112
>>> id(y['lang'])
53999112
# x,y的name键值为str类型,地址不同,是不同对象,互相独立
>>> id(x['name'])
53995032
>>> id(y['name'])
53995088
-----以上,就是所谓的"浅拷贝"------------
结论就是,拷贝完后,若值为"可变的",该值若更改,另一个对象该值也会跟着变
若值为不可变,则独立,不互相影响
Python在所执行的复制动作中,如果是基本类型的对象(专指数字和字符串),
就在内存中重新建个窝;如果不是基本类型的,就不新建窝了,而是用标签引用原来的窝。
# 使用copy库,实现深度拷贝,互相独立
>>> x
{'name': 'qiwsir', 'lang': ['python', 'java']}
# 深拷贝
>>> import copy
>>> z=copy.deepcopy(x)
>>> z
{'name': 'qiwsir', 'lang': ['python', 'java']}
# 果然,地址不一样了
>>> id(x['lang'])
53999112
>>> id(z['lang'])
51361992
# 删除可变键值试试,结果果然是独立的
>>> x['lang'].remove('java')
>>> x
{'name': 'qiwsir', 'lang': ['python']}
>>> z
{'name': 'qiwsir', 'lang': ['python', 'java']}
# 添加可变键值,结果也没有意外
>>> x['lang'].append('C++')
>>> x
{'name': 'qiwsir', 'lang': ['python', 'C++']}
>>> z
{'name': 'qiwsir', 'lang': ['python', 'java']}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,719评论 0 10
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,913评论 17 410
  • 文|元煦来源 | 元煦说(ID:dushu6688) 周末和几个老友吃了顿火锅。 听一个朋友说,自从成年以后,越来...
    捡书先生说阅读 573评论 0 0
  • 文/源于 荔枝电台我在厦门,你在哪 刚结束工作回到厦门,,这两天阴雨绵绵,空气中带着润物的气味。整个厦门在烟雨中...
    一只过气的猫阅读 347评论 0 0
  • 今天李笑来老师提出了一个非常宏大的概念预告,什么是知识?我觉得如果让我来定义知识的话,我感觉都说不清楚。 他说开始...
    许江浩阅读 263评论 0 0