16_字典(dict)

2018-11-05  本文已影响0人  秋的懵懂

时间:2018-11-03 作者:魏文应


一、字典

什么是字典?

在字典中,可以保存多个对象,每个对象都会有一个唯一的名字:

创建字典

字典通过大括号 { } 进行创建,例如:

d = {} # 创建了一个空字典

字典创建的语法如下:

# 字典的值可以是任意对象
# 字典的键可以是任意的不可变对象(int、str、bool、tuple ...)
#     字典的键不能重复,一般用字符串 str。
{key:value, key:value, key:value}

例如:

d = {
    'name': '孙悟空',
    'age': 18,
    'gender': '男'
}

print(d['name'], d['age'], d['gender'])

通过 索引到了 ,打印结果如下:

孙悟空 18 男

dict() 函数创建字典

使用 dict() 函数创建字典:

d = dict(name='孙悟空', age=18, gender='男')
print(d, type(d))

这种方式创建的字典,key 都是字符串,打印结果如下:

{'name': '孙悟空', 'age': 18, 'gender': '男'} <class 'dict'>

dict() 函数,也可以将一个包含有 双值子序列的序列 转换为字典:

d = dict([('name', '孙悟空'), ('age', 18)])
print(d, type(d))

子序列中,前面一个元素为键,后面一个元素为值,打印结果如下:

{'name': '孙悟空', 'age': 18} <class 'dict'>

双值序列

序列中只有两个字值的序列叫做 双值序列,比如下面的都是双值序列:

[1, 3]
['a', 1]
'ab'

子序列

如果序列中的元素也是序列,那么称这个元素为 子序列。比如:

[(1, 3), (3, 5)]

获取键值对个数

可以通过 len() 函数,获取字典中键值对的个数,比如:

d = {'a':1, 'b':2, 'c':3}
print(len(d))

这就获取了字典 d 中的键值对个数,打印结果如下:

3

检查是否包含某个键

可以使用 in 检查字典中是否包含某个键,比如:

d = {'a': 1, 'b': 2, 'c': 3}
print('hello' in d)

上面,检查 hello 这个键在不在 d 这个字典中,打印结果如下:

False

get() 方法获取键

可以使用 get() 方法,来获取键,如果键不存在,返回 None 。比如:

d = {
    'name': '孙悟空',
    'age': 18,
    'gender': '男'
}

print(d.get('name'))  # 返回键值孙悟空
print(d.get('hello'))  # hello 键没有,返回 None
print(d.get('hello', '没有hello'))  # 没有hello键时,返回 '没有hello'

如果直接使用 d['hello'] 去索引字典,程序会因为字典没有这个键而报错,通过get()方法则不会报错,打印结果如下:

孙悟空
None
没有hello

修改字典

可以通过 d[key] = value 的方式,来进行字典元素值的修改:

d = {'name': '孙悟空','age': 18,'gender': '男'}
d['name'] = 'sunwukong'
print(d)

上面,修改了键为 name 的值,打印结果如下:

{'name': 'sunwukong', 'age': 18, 'gender': '男'}

如果没有对应的键,则在字典末尾自动添加,比如:

d = {'name': '孙悟空','age': 18,'gender': '男'}
d['address'] = '花果山'
print(d)

上面,因为没有 address 这个键,所以,就自动在末尾添加一个键值对 'address': '花果山',打印结果如下:

{'name': '孙悟空', 'age': 18, 'gender': '男', 'address': '花果山'}

可以使用 setdefualt(key[, default]) 方法,来向字典添加 key-value :

d = {'name': '孙悟空', 'age': 18, 'gender': '男'}
d.setdefault('name', '猪八戒')
print(d)
d.setdefault('address', '花果山')
print(d)

所以,打印结果如下:

{'name': '孙悟空', 'age': 18, 'gender': '男'}
{'name': '孙悟空', 'age': 18, 'gender': '男', 'address': '花果山'}

合并字典

可以使用 update() 方法,合并字典,如果遇到相同的键,则更新这个键的值。比如:

d = {'a': 1, 'b': 2, 'c': 3}
d2 = {'d': 4, 'e': 5, 'f': 6, 'a': 7}
d2.update(d)
print(d2)

d 被合并到了 d2 后面,相同的键名 a 的对应的值被更新了,打印结果如下:

{'d': 4, 'e': 5, 'f': 6, 'a': 1, 'b': 2, 'c': 3}

删除字典中的键值对

可以使 del 删除字典中的一个键值对,例如:

d = {'a': 1, 'b': 2, 'c': 3}
del d['a']
print(d)

上面,就会把键值对 'a': 1 删除掉,打印结果如下:

{'b': 2, 'c': 3}

如果没有对应的键名,则会报错,比如:

d = {'a': 1, 'b': 2, 'c': 3}
del d['f']    # 这里会报错

还可以使用 popitem()随机删除 字典中的一个键值对,一般都会删除最后一个键值对:

d = {'a': 1, 'b': 2, 'c': 3}
result = d.popitem()
print('result =',result)
print(d)

打印结果如下:

result = ('c', 3)
{'a': 1, 'b': 2}

还可以使用 pop() 方法进行删除指定的键值对:

d = {'a': 1, 'b': 2, 'c': 3}
result = d.pop('a')
print('result =', result)
print(d)
result = d.pop('f', '键值不存在')
print('result =', result)

打印结果如下:

result = 1
{'b': 2, 'c': 3}
result = 键值不存在

清空字典(clear)

可以使用 clear() 方法,清空字典内的所有键值对:

d = {'a': 1, 'b': 2, 'c': 3}
d.clear()
print(d)

上面,清空了字典 d 内的所有键值对,打印结果如下:

{}

浅复制

可以使用 copy() 方法进行复制操作,将一个字典 d 复制到 d2 中。注意:

d = {'a': {'name': '猪八戒'}, 'b': 2, 'c': 3}
d2 = d.copy()
d2['a']['name'] = '孙悟空'
d2['b'] = 11
print('d =', d, id(d))
print('d2 = ', d2, id(d2))

上面, dd2 是相互对立的,但键值对 'a': {'name': '猪八戒'} 的值是一个可变对象,d2['a']['name'] = '孙悟空' 会使得 dd2都发生改变。可以理解为,字典 dd2 的键值对的值只是保存了变量的地址。

遍历字典

字典的遍历,有多种方法,可以使用 keys() 方法,获取 键值对

d = {'a': {'name': '猪八戒'}, 'b': 2, 'c': 3}
for k in d.keys():
    print(k, d[k])

上面,打印结果如下:

name 沙和尚
b 2
c 3

也可以通过 value() 方法,但这样只获取到

d = {'name': '沙和尚', 'b': 2, 'c': 3}
for v in d.values():
    print(v)

上面,打印结果如下:

沙和尚
2
3

还可以使用 items() 方法,它会返回序列,序列中包含有 双值子序列

d = {'name': '沙和尚', 'b': 2, 'c': 3}
print(d.items())
for k, v in d.items():
    print(k, '=', v)

打印结果如下:

dict_items([('name', '沙和尚'), ('b', 2), ('c', 3)])
name = 沙和尚
b = 2
c = 3
上一篇 下一篇

猜你喜欢

热点阅读