User:Xyy23330121/Python/字典

来自维基学院


创建字典[编辑 | 编辑源代码]

基本的创建和使用[编辑 | 编辑源代码]

a = {"key1": "value1", "key2": "value2"}  #创建字典
print(a["key1"])   #输出:value1
b = {}             #创建空字典

以上示例是一个简单的、使用字典的方法。通过输入正确的键,我们可以从字典得到该键对应的值。

几乎所有变量都可以作为字典的键,但可变类型(列表、字典等)不可作为字典的键。

比较运算结果相等的值,比如整数1、浮点数1.0和布尔值True,可以被互换使用,并索引到同一个值。

用推导式生成字典[编辑 | 编辑源代码]

类似列表,字典也有推导式。我们看以下示例:

a = {x: x ** 2 for x in range(10) if x not in range(:10:2)}
print(a[5])   #输出:25
b = {x: x ** 3 for x in range(10)}
print(b[5])   #输出:125

zip 函数[编辑 | 编辑源代码]

使用 zip 函数[1],我们可以同时迭代多个可迭代对象。迭代次数按可迭代次数最少的对象来指定。比如:

print(list(zip("Python","012")))  #输出:[('P', '0'), ('y', '1'), ('t', '2')]

于是,我们可以利用该函数配合生成器高效地创建字典,比如:

a = {x: y*3 for x,y in zip(range(10),"Python")}
print(a[5])   #输出:nnn

zip 函数之外,Python 内置的 itertools 模块实现了更多高级的可迭代对象作为循环迭代的工具。读者可以查阅对应的 Python 模块文档进行补充。

用 dict 函数创建字典[编辑 | 编辑源代码]

我们也可以用 dict 函数来创建字典。比如:

a = dict(one=1, two=2, three=3)
b = dict([("one",1),("two",2),["three",3]])
c = dict((("one",1),["three",3]), two = 2)
print(a==b==c)    #输出:True
d = dict()        #创建空字典

由长度为 2 的列表或元组构成的列表或元组可以直接转化为字典。同时,也可以用类似传入参数的方式生成字典。

要注意,以下的方式是不合法的:

dict(0 = 1)  #报错:SyntaxError

对于不符合变量命名规则的键(比如“数字”或“字符串以数字开头”的键),就不能用这种方法。

用 dict.fromkeys 创建字典[编辑 | 编辑源代码]

该方法有两个参数:

  1. iterable:由可以作为字典键的元素构成的可迭代对象
  2. value:(可选)这些键对应的值,默认为None

我们看以下示例:

a = dict.fromkeys("Python",3)
print(a)
#输出:{'P': 3, 'y': 3, 't': 3, 'h': 3, 'o': 3, 'n': 3}

字典的操作[编辑 | 编辑源代码]

可迭代序列[编辑 | 编辑源代码]

字典是可迭代序列。当对它进行迭代时,等同于对它的“键”进行迭代。迭代顺序则是按“键”被输入的顺序进行。

我们可以通过 listtuple 函数确认这一点。

a = dict.fromkeys("Python",3) #按顺序输入了键 "P" "y" "t" "h" "o" "n"
print(list(a))

类似其它可迭代序列,len 函数会返回字典的项数。而 innot in 则会判断“键”在/不在字典中。

简单操作[编辑 | 编辑源代码]

读取字典的值[编辑 | 编辑源代码]

dict[key][编辑 | 编辑源代码]

对于创建的一个字典对象 d = {0 : "zero"},可以使用 d[0] 来读取 d 中对应键0 的值。但如果字典中没有键 0 则会报错。

此方法仅适用于程序员已经明确了解,所使用的索引是字典的键的时候。如果程序员不知道,则可以参照以下dict.get方法。

dict.get(key[, default])[编辑 | 编辑源代码]

我们看以下示例:

d = {0 : "zero"}
print(d.get(0))        #输出:zero
print(d.get(1))        #输出:None
print(d.get(1,"one"))  #输出:one

default 参数的默认值是 None 。如果参数 key 是字典 d 中的键,则 d.get(key) 会返回 d[key] 的值。反之,会返回 default 参数的值。

给字典元素赋值[编辑 | 编辑源代码]

dict[key] = value[编辑 | 编辑源代码]

我们看以下示例:

d = {0 : "zero"}
d[0] = "Zero"  #将 d 中对应键 0 的值更新为 "Zero"。
print(d)       #输出:{0: 'Zero'}
d[1] = "One"   #在 d 中创建新键 1,使其值为 "One"。
print(d)       #输出:{0: 'Zero', 1: 'One'}

这种方式无论键是否已经存在,都会对字典进行修改。

dict.setdefault(key[, default])[编辑 | 编辑源代码]

我们看以下示例:

d = {0 : "zero"}
dict.setdefault(0, "Zero")  #查找 d 中是否已有键 0,由于已有键 0,这里不操作。
print(d)       #输出:{0: 'zero'}
dict.setdefault(1, "One")   #查找 d 中是否已有键 1,由于没有键 1,这里创建新键 1,使其值为 "One"。
print(d)       #输出:{0: 'zero', 1: 'One'}

这种方式只有在键不存在时,才会进行修改。

删除字典元素[编辑 | 编辑源代码]

del dict[key][编辑 | 编辑源代码]

del d[key] 会删除字典 d 中,对应键 key 的项目。如果没有符合键 key 的项目,则会报错 KeyError

dict.pop(key[, default])[编辑 | 编辑源代码]

使用 d.pop 时。如果 key 存在于字典 d 中,则将其移除并返回其值;
如果 key 不在 d 中,则返回 default 的值。此时,如果 default 未给出,则会报错 KeyError

dict.popitem()[编辑 | 编辑源代码]

d.popitem 会以“后进先出”的原则,删除字典 d 中最后一个键及其对应的值,并返回其值。如果 d 是空字典,则会报错。

可变序列操作[编辑 | 编辑源代码]

字典同时也是可变序列。与可变序列“列表”相同,如果使用以下方法:

a = {0: None, 1: True}
b = a
b[0] = False
print(a)     #输出:{0: False, 1: True}

在更改 b 的时候,会导致 a 的值也发生改变。这是因为 ba 本质上是同一个对象。

字典支持可变序列的这两个操作:

  1. dict.clear():对于已有的字典 dd.clear() 会清除 d 中的一切键值对,使其变成一个空字典。
  2. dict.copy():对于已有的字典 dd.copy() 会返回 d 的一个复制。

用另一字典对字典进行更新[编辑 | 编辑源代码]

dict.update([other]) 或 dict |= other[编辑 | 编辑源代码]

这两个方法都会取 other 的值来更新 dict 的值。其结果等同于:

for key in other:
    dict[key] = other[key]

other 一般是一个字典,但也可以是任何“可以用dict函数转化为字典的”对象。

对于 dict.update 的情况,还可以使用这种方式:

dict.update(key = value)

dict | other[编辑 | 编辑源代码]

返回一个“相当于 dictother 更新后的字典”的新字典。而 dict 不会被更改。

返回所有键、所有值、或所有键值对[编辑 | 编辑源代码]

Python 提供了以下三种方法:

  1. dict.items():返回所有键值对元组(键, 值)构成的视图
  2. dict.keys():返回所有键构成的视图
  3. dict.values():返回所有值构成的视图

视图[编辑 | 编辑源代码]

字典的视图简单来讲就是随着字典更新而更新的可迭代序列。视图支持 len 函数、比较运算 innot in 以及一些其它操作。其他操作不多赘述。

參考文獻[编辑 | 编辑源代码]