在此谢谢Datawhale提供的资料帮助学习,[1]
为资料来源
1. 可变类型和不可变类型
注意区别序列和字典:
(1)序列是以连续的整数为索引
(2)字典是以"关键字"为索引,关键字可以是任意不可变类型,通常用字符串或数值。
那么如何判断一个数据类型x
是不是可变类型?
下面两种方法:
(1)麻烦方法:用 id(x)
函数,对x
进行某种操作,比较操作前后的 id
,如果不一样,则x
不可变,如果一样,则x
可变。
下面进行举例子:
i = 1
print(id(i)) # 140732167000896
i = i + 2
print(id(i)) # 140732167000960
print(type(i))
# <class 'int'>
l = [1, 2]
print(id(l)) # 4300825160
l.append('Python')
print(id(l)) # 4300825160
print(type(l))
# <class 'list'>
第一个例子:整数i
在加了2之后id
就和原来不一样了,说明它是不可变类型
第二个例子:列表l
在加了Python
后还是和原来一样,说明它是可变类型
(2)便捷方法:用 hash(x)
,只要不报错,证明x
可被哈希,即不可变,反过来不可被哈希,即可变。
print(hash('Name')) # -9215951442099718823
print(type(('Name'))) # <class 'str'>
print(hash((1, 2, 'Python'))) # 823362308207799471
print(type((1, 2, 'Python'))) # <class 'tuple'>
print(hash([1, 2, 'Python']))
# TypeError: unhashable type: 'list'
print(hash({1, 2, 3}))
# TypeError: unhashable type: 'set'
综上所述:数值、字符串和元组都能被哈希,因此它们是不可变类型。
列表、集合、字典不能被哈希,因此它是可变类型。
- 那么什么是哈希呢?
2. 字典的定义
(1)语法
语法为 {元素1, 元素2, ..., 元素n}
,其中每一个元素是一个「键值对
」-- 键:值 (key:value
)
关键点是大括号 {}
,逗号 ,
和冒号 :
大括号:把所有元素绑在一起
逗号:将每个键值对分开
冒号:将键和值分开
(2)课外了解
在同一个字典中,键与键之间是互不一样的。并且字典是无序的。
dict
内部存放的顺序和 key
放入的顺序是没有关系的。
dict
查找和插入的速度极快,不会随着 key
的增加而增加,但是需要占用大量的内存。
综上所述:字典的语法结构是 {key1;value1, key2:value2, ..., keyn:valuen}
,其中大括号把所有元素(keyi:valuei
)包在一起,逗号是分开每个键keyi
,键与键之间是不一样的,冒号是分开键keyi
和值valuei
。字典是无序的。
3. 创建和访问字典
- 基本例子
dic = {'李宁': '一切皆有可能', '耐克': 'Just do it', '阿迪达斯': 'Impossible is nothing'}
print('耐克的口号是:', dic['耐克'])
# 耐克的口号是: Just do it
- 数值或者字符串作为
key
的字典
dic1 = {1: 'one', 2: 'two', 3: 'three'}
print(dic1) # {1: 'one', 2: 'two', 3: 'three'}
print(dic1[1]) # one
print(dic1[4]) # KeyError: 4
可以发现:
(1)取的键在字典中不存在,会直接报错KeyError
(2)利用数值i
作为字典的键位的时候,索引的时候直接是字典[i]
dic2 = {'rice': 35, 'wheat': 101, 'corn': 67}
print(dic2) # {'wheat': 101, 'corn': 67, 'rice': 35}
print(dic2['rice']) # 35
可以发现:
(1)自己创建字典后和打印出来字典的顺序是不一样的
(2)利用字符串'string'
作为字典的键位的时候,索引的时候直接是字典['string']
,要注意引号
3. 元组来作为key
的字典
dic = {(1, 2, 3): "Tom", "Age": 12, 3: [3, 5, 7]}
print(dic) # {(1, 2, 3): 'Tom', 'Age': 12, 3: [3, 5, 7]}
print(type(dic)) # <class 'dict'>
可以发现:
(1)值可以是列表或者数值或者字符串,关键字一般是不可变类型,例如元组、数值、字符串
(2)元组作为键挺别扭的,所以一般少用
dict
创建空字典,然后利用key
把数据放入字典
一个key
只能对应一个value
,同一个key
多次放入,后面的值会把前面的值冲掉
dic = dict()
dic['a'] = 1
dic['b'] = 2
dic['c'] = 3
print(dic)
# {'a': 1, 'b': 2, 'c': 3}
dic['a'] = 11
print(dic)
# {'a': 11, 'b': 2, 'c': 3}
可以发现:
(1)可以通过对索引键更换键所对应的值
5.利用dict(mapping)
new dictionary initialized from a mapping object’s (key, value) pairs
就像前面所说,同一个字典不能有相同的键,但是不同字典可以有相同的键位
dic1 = dict([('apple', 4139), ('peach', 4127), ('cherry', 4098)])
print(dic1) # {'cherry': 4098, 'apple': 4139, 'peach': 4127}
dic2 = dict((('apple', 4139), ('peach', 4127), ('cherry', 4098)))
print(dic2) # {'peach': 4127, 'cherry': 4098, 'apple': 4139}
dict(**kwargs)
new dictionary initialized with the name=value pairs in the keyword argument list. For example: dict(one=1, two=2)
这种情况下,键只能为字符串类型,并且创建的时候字符串不能加引号,加上就会直接报语法错误
dic = dict(name='Tom', age=10)
print(dic) # {'name': 'Tom', 'age': 10}
print(type(dic)) # <class 'dict'>
综上所述,关于字典的创建一共有如下几种方法:
(1)最基本的就是dic1={元组/字符串/数值:列表/数值/字符串}
(2)先用dict()
创建一个空字典,然后用key
把数据放入,例如
dic=dict()
dic['a']=1
(3)dict(mapping)
例如:
dic1 = dict([('apple', 4139), ('peach', 4127), ])
之前的基本创建是
dic1={元组/字符串/数值:列表/数值/字符串,元组/字符串/数值:列表/数值/字符串}
这个是
dic1 = dict([(元组/字符串/数值,列表/数值/字符串), (元组/字符串/数值,列表/数值/字符串)])
(4)dict(**kwargs)
键只能是字符串,并且创建的时候不能加引号
dic = dict(没有引号的字符串=列表/数值/字符串, 没有印好的字符串=列表/数值/字符串)
值可以通过索引键:字典[键名称]
4. 字典的内置方法
字典的内置方法有如下几种
(1)dict.fromkeys(seq[, value])
(2)dict.keys()
(3)dict.values()
(4)dict.items()
(5)dict.get(key, default=None)
(6)dict.setdefault(key, default=None)
(7)key in dict in
(8)dict.pop(key[,default])
(9)del dict[key]
(10)dict.popitem()
(11)dict.clear()
(12)dict.copy()
(13)dict.update(dict2)
[1]https://github.com/datawhalechina/team-learning-program/blob/master/Python-Language/09.%20%E5%AD%97%E5%85%B8.md