Update 09. 字典.md

This commit is contained in:
LSGOMYP
2020-07-21 12:12:01 +08:00
parent 7b1084b895
commit 61a5cba043

View File

@@ -1,3 +1,4 @@
# 字典
## 1. 可变类型与不可变类型
@@ -9,6 +10,8 @@
- 麻烦方法:用 `id(X)` 函数,对 X 进行某种操作,比较操作前后的 `id`,如果不一样,则 `X` 不可变,如果一样,则 `X` 可变。
- 便捷方法:用 `hash(X)`,只要不报错,证明 `X` 可被哈希,即不可变,反过来不可被哈希,即可变。
【例子】
```python
i = 1
print(id(i)) # 140732167000896
@@ -24,6 +27,8 @@ print(id(l)) # 4300825160
- 列表 `l` 在附加 `'Python'` 之后的 `id` 和之前一样,因此列表是可变类型。
【例子】
```python
print(hash('Name')) # -9215951442099718823
@@ -72,11 +77,11 @@ print('耐克的口号是:', dic['耐克'])
# 耐克的口号是: Just do it
```
通过字符串或数值作为`key`来创建字典。
注意:如果我们取的键在字典中不存在,会直接报错`KeyError`
【例子】
【例子】通过字符串或数值作为`key`来创建字典。
```python
dic1 = {1: 'one', 2: 'two', 3: 'three'}
print(dic1) # {1: 'one', 2: 'two', 3: 'three'}
@@ -88,6 +93,7 @@ print(dic2) # {'wheat': 101, 'corn': 67, 'rice': 35}
print(dic2['rice']) # 35
```
注意:如果我们取的键在字典中不存在,会直接报错`KeyError`
【例子】通过元组作为`key`来创建字典,但一般不这样使用。
@@ -99,7 +105,7 @@ print(type(dic)) # <class 'dict'>
通过构造函数`dict`来创建字典。
- `dict()` -> 创建一个空的字典。
- `dict()` 创建一个空的字典。
【例子】通过`key`直接把数据放入字典中,但一个`key`只能对应一个`value`,多次对一个`key`放入 `value`,后面的值会把前面的值冲掉。
@@ -121,7 +127,7 @@ print(dic)
# {'a': 11, 'b': 2, 'c': 3, 'd': 4}
```
- `dict(mapping)` -> new dictionary initialized from a mapping object's (key, value) pairs
- `dict(mapping)` new dictionary initialized from a mapping object's (key, value) pairs
【例子】
```python
@@ -150,16 +156,16 @@ print(type(dic)) # <class 'dict'>
```python
seq = ('name', 'age', 'sex')
dic1 = dict.fromkeys(seq)
print("新的字典为 : %s" % str(dic1))
# 新的字典为 : {'name': None, 'age': None, 'sex': None}
print(dic1)
# {'name': None, 'age': None, 'sex': None}
dic2 = dict.fromkeys(seq, 10)
print("新的字典为 : %s" % str(dic2))
# 新的字典为 : {'name': 10, 'age': 10, 'sex': 10}
print(dic2)
# {'name': 10, 'age': 10, 'sex': 10}
dic3 = dict.fromkeys(seq, ('小马', '8', ''))
print("新的字典为 : %s" % str(dic3))
# 新的字典为 : {'name': ('小马', '8', '男'), 'age': ('小马', '8', '男'), 'sex': ('小马', '8', '男')}
print(dic3)
# {'name': ('小马', '8', '男'), 'age': ('小马', '8', '男'), 'sex': ('小马', '8', '男')}
```
- `dict.keys()`返回一个可迭代对象,可以使用 `list()` 来转换为列表,列表为字典中的所有键。
@@ -177,8 +183,11 @@ print(lst) # ['Name', 'Age']
【例子】
```python
dic = {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}
print("字典所有值为 : ", list(dic.values()))
# 字典所有值为 : [7, 'female', 'Zara']
print(dic.values())
# dict_values(['female', 7, 'Zara'])
print(list(dic.values()))
# [7, 'female', 'Zara']
```
- `dict.items()`以列表返回可遍历的 (键, 值) 元组数组。
@@ -186,20 +195,24 @@ print("字典所有值为 : ", list(dic.values()))
【例子】
```python
dic = {'Name': 'Lsgogroup', 'Age': 7}
print("Value : %s" % dic.items())
# Value : dict_items([('Name', 'Lsgogroup'), ('Age', 7)])
print(dic.items())
# dict_items([('Name', 'Lsgogroup'), ('Age', 7)])
print(tuple(dic.items()))
print(tuple(dic.items()))
# (('Name', 'Lsgogroup'), ('Age', 7))
print(list(dic.items()))
# [('Name', 'Lsgogroup'), ('Age', 7)]
```
- `dict.get(key, default=None)`返回指定键的值,如果值不在字典中返回默认值。
- `dict.get(key, default=None)` 返回指定键的值,如果值不在字典中返回默认值。
【例子】
```python
dic = {'Name': 'Lsgogroup', 'Age': 27}
print("Age 值为 : %s" % dic.get('Age')) # Age 值为 : 27
print("Sex 值为 : %s" % dic.get('Sex', "NA")) # Sex 值为 : NA
print(dic) # {'Name': 'Lsgogroup', 'Age': 27}
```
- `dict.setdefault(key, default=None)``get()`方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
@@ -209,8 +222,8 @@ print("Sex 值为 : %s" % dic.get('Sex', "NA")) # Sex 值为 : NA
dic = {'Name': 'Lsgogroup', 'Age': 7}
print("Age 键的值为 : %s" % dic.setdefault('Age', None)) # Age 键的值为 : 7
print("Sex 键的值为 : %s" % dic.setdefault('Sex', None)) # Sex 键的值为 : None
print("新字典为:", dic)
# 新字典为: {'Age': 7, 'Name': 'Lsgogroup', 'Sex': None}
print(dic)
# {'Age': 7, 'Name': 'Lsgogroup', 'Sex': None}
```
- `key in dict` `in` 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回`true`,否则返回`false`。而`not in`操作符刚好相反,如果键在字典 dict 里返回`false`,否则返回`true`
@@ -276,7 +289,8 @@ print(dic1) # {2: [1, 2]}
dic = {'Name': 'Zara', 'Age': 7}
print("字典长度 : %d" % len(dic)) # 字典长度 : 2
dict.clear()
print("字典删除后长度 : %d" % len(dic)) # 字典删除后长度 : 0
print("字典删除后长度 : %d" % len(dic))
# 字典删除后长度 : 0
```
- `dict.copy()`返回一个字典的浅复制。
@@ -286,8 +300,8 @@ print("字典删除后长度 : %d" % len(dic)) # 字典删除后长度 : 0
```python
dic1 = {'Name': 'Lsgogroup', 'Age': 7, 'Class': 'First'}
dic2 = dic1.copy()
print("新复制的字典为 : ", dic2)
# 新复制的字典为 : {'Age': 7, 'Name': 'Lsgogroup', 'Class': 'First'}
print("dic2)
# {'Age': 7, 'Name': 'Lsgogroup', 'Class': 'First'}
```
【例子】直接赋值和 copy 的区别
@@ -296,7 +310,7 @@ dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}
# 引用对象
dic2 = dic1
# 拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
# 拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
dic3 = dic1.copy()
print(id(dic1)) # 148635574728
@@ -324,8 +338,8 @@ print(dic3) # {'user': 'runoob', 'num': [2, 3]}
dic = {'Name': 'Lsgogroup', 'Age': 7}
dic2 = {'Sex': 'female', 'Age': 8}
dic.update(dic2)
print("更新字典 dict : ", dic)
# 更新字典 dict : {'Sex': 'female', 'Age': 8, 'Name': 'Lsgogroup'}
print(dic)
# {'Sex': 'female', 'Age': 8, 'Name': 'Lsgogroup'}
```
---