Python学习日记-字典

本章目录

  • Part One:基本概念
  • Part Two:常用方法

在Java里,存在一种K(key)-V(value)对应关系(键值对)的数据结构,称之为Map。
而Python中也有类似的结构,那就是dict(字典)。之所以叫字典,是因为我们可以把key想象成字典中的单词,而value就是该单词的释义了。所以呢,一个单词可以对应一个或者多个释义,但是这些释义只能通过单词来查询。
需要注意的是,字典中key都是唯一的。每个key只会对应1个value。所谓的一个单词对应多个释义,是因为这个释义是List类型的,而不是说有多个value。
字典具有极快的查找速度。

基本概念

  1. 空字典
# Python使用{}或者dict()来创建空字典
dict1 = {}
# type可以查看对象的类型
print(type(dict1))
dict2 = dict()
print(type(dict2))

结果为:

<class 'dict'>
<class 'dict'>
  1. 初始化字典
# 可以用key-value的形式初始化字典
dict_nba = {"LeBron James": "Cleveland Cavaliers", "James Harden": "Houston Rockets",
             "Stephen Curry": "Golden State Warriors"}
# 打印字典
print(dict_nba)
# 打印该键对应的值
print(dict_nba["James Harden"])

结果为

{'LeBron James': 'Cleveland Cavaliers', 'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors'}
Houston Rockets
  1. 插入键值对
# dict()创建字典的方式之一
# 此处用dict方式而不是{}方式,是因为{}方式会报This dictionary creation could be rewritten as a dictionary literal.警告
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
                 ("Stephen Curry", "Golden State Warriors")])
# 直接给 dict[key] 赋值即可完成插入操作
dict_nba["Kevin Durant"] = "Golden State Warriors"
print(dict_nba)

结果为:

{'LeBron James': 'Cleveland Cavaliers', 'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors', 'Kevin Durant': 'Golden State Warriors'}
  1. 更新键值
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
                 ("Stephen Curry", "Golden State Warriors")])
# 给同样的key,指定另外一个值。结果为key相同,值覆盖
dict_nba["Kevin Durant"] = "Oklahoma City Thunder"
print(dict_nba)

结果为:

{'LeBron James': 'Cleveland Cavaliers', 'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors', 'Kevin Durant': 'Oklahoma City Thunder'}
  1. 字典没有顺序
    当我们print一个字典时,Python并不一定按照插入键值的先后顺序进行显示,因为字典中的键本身不一定是有序的。如果想让字典有序,需要制定相应的规则对key排序。
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
                 ("Stephen Curry", "Golden State Warriors")])
# 字典不支持使用数字index来查看字典中的值,因为数字也是可以作为索引的,容易造成混淆
print(dict_nba[0])

结果为:

KeyError: 0
  1. 键必须是不可变的
    Python中要求字典中的键值对的键必须是不可变的,而值可以是任意的Python对象。
    这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
    要保证hash的正确性,作为key的对象就不能变。
    不过,键的类型可以是不同类型的。
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
                 ("Stephen Curry", "Golden State Warriors")])
dict_nba[1] = "Oklahoma City Thunder"
dict_nba["Dwight Howard"] = ["Orlando Magic", "Los Angeles Lakers", "Houston Rockets",
                             "Atlanta Hawks", "Charlotte Hornets"]
print(dict_nba)

结果为:

{'LeBron James': 'Cleveland Cavaliers', 'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors', 1: 'Oklahoma City Thunder', 'Dwight Howard': ['Orlando Magic', 'Los Angeles Lakers', 'Houston Rockets', 'Atlanta Hawks', 'Charlotte Hornets']}
  1. 适合做键的类型
    通常,我们习惯使用字符串或者整数来作为键。
    List是可变的,不能作为键,会报unhashable type异常,就是无法哈希化。
    浮点数虽然也是不可变的,但是最好不要使用浮点数作为键,因为浮点数在进行数学运算后会损失精度,比如1.1 + 2.2和3.3其实是两个不同的键。
    元组不可变,且是有序的,可以作为键,但是使用时必须保证元祖内不包含list。
    总之,作为key必须可以被哈希化,所以键或者键中的内容都是可不变的。
flights = dict([
    (("Beijing", "Shanghai"), "21:15 PM"),
    (("Shanghai", "Beijing"), "6:15 PM")])
flights["New"] = "Unknown"
flights[1] = "Hello"
print(flights)

结果为:

{('Beijing', 'Shanghai'): '21:15 PM', ('Shanghai', 'Beijing'): '6:15 PM', 'New': 'Unknown', 1: 'Hello'}
  1. 列表和字典的区别
列表 字典
顺序 能保证存放顺序 无序
访问方法 索引 key
查找和插入速度 随着元素的增加而增加 不会随着key的增加而变慢, 速度恒定
占用空间 占用内存小 内存开销稍大

常用方法

  1. in方法查询字典中是否有该键
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
                 ("Stephen Curry", "Golden State Warriors")])
name = "LeBron James"
# in方法检索key,返回值为True或者False
if name in dict_nba:
    print(name, "is an American professional basketball player for the", dict_nba[name] + ".")
else:
    print("Not a NBA player.")

结果为:

LeBron James is an American professional basketball player for the Cleveland Cavaliers.
  1. get方法查询字典中是否有该键
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
                 ("Stephen Curry", "Golden State Warriors")])
name = "LeBron James"
# get方法检索key,若存在直接返回该key对应的value
print(dict_nba.get(name))
# get方法检索key,若不存在直接返回None
if dict_nba.get("Kevin Love"):
    print(name, "is an American professional basketball player for the", dict_nba[name] + ".")
else:
    print("Not a NBA player.")
# 或者可通过修改get(key, default = None)中的default值来指定默认返回值
print(dict_nba.get("Kevin Love", "Unknown."))

结果为:

Cleveland Cavaliers
Not a NBA player.
Unknown.
  1. pop,del方法删除键值对
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
                 ("Stephen Curry", "Golden State Warriors")])
# pop方法和get方法类似,也是pop(key, default = None)形式的
# 同样的,若key存在,则从字典中删除该key和value,并返回该key对应的value;若key不存在,返回default的值
print(dict_nba.pop("LeBron James"))
print(dict_nba)
# 已从表中删除,所以返回Unknown
print(dict_nba.pop("LeBron James", "Unknown."))
# del也可以从字典中删除键值对,并且无返回值
del dict_nba["James Harden"]
print(dict_nba)

结果为:

Cleveland Cavaliers
{'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors'}
Unknown.
{'Stephen Curry': 'Golden State Warriors'}
  1. update方法更新字典
dict_nba = dict([("LeBron James", "Cleveland Cavaliers"), ("James Harden", "Houston Rockets"),
                 ("Stephen Curry", "Golden State Warriors")])
# update方法,参数为字典,无返回值
# 也可用于修改value
temp = {"Dwight Howard": ["Orlando Magic", "Los Angeles Lakers", "Houston Rockets", "Atlanta Hawks", "Charlotte Hornets"],
        "Kobe Bryant": "Retired",
        "LeBron James": ["Miami Heat", "Cleveland Cavaliers"]}
dict_nba.update(temp)
print(dict_nba)

结果为:

{'LeBron James': ['Miami Heat', 'Cleveland Cavaliers'], 'James Harden': 'Houston Rockets', 'Stephen Curry': 'Golden State Warriors', 'Dwight Howard': ['Orlando Magic', 'Los Angeles Lakers', 'Houston Rockets', 'Atlanta Hawks', 'Charlotte Hornets'], 'Kobe Bryant': 'Retired'}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容