目录
1 字典
1.1 可变类型与不可变类型
1.序列是以连续的整数作为索引,与此不同的是,字典以“关键词”为索引,关键字可以是任意不可变类型,通常用字符或者数值。
2.字典是python唯一的一个映射类型,字符串、元组、列表属于序列类型。
判断一个数据类型是否为课表类型:
1.用id(x)函数,对x进行某种操作,比较操作前后的id,如果不一样则x不可变如果一样,则x可变。
2.用hash(x)函数,只要不报错证明x可以被哈希,否则不可以被哈希,既可变。
i = 1
print(id(i))
>>>2017486924080
i = i + 1
print(id(i))
>>>2017486924112
l = [1,2]
print(id(l))
>>>2017649726976
l.append('3q')
print(id(l))
>>>2017649726976
1.i在进行加一之后id和之前不一样,因此加完之后的这个i(虽然名字没变),但已经不是之前那个i了,此整数是不可变类型。
2.列表l在附加3q之后的id和之前一样,因此列表是可变类型。
print(hash('abc'))
>>>7702665277697577989
print(hash((1,2,'python')))
>>>3632879410630742111
print(hash([1,2,'python']))
>>>TypeError: unhashable type: 'list'
print(hash({1,2,3}))
>>>TypeError: unhashable type: 'set'
1.数值、字符和元组都能被哈希,因此他们是不可变类。
2.列表、集合和字典不能被哈希,因此它是可变类型。
1.2 字典的定义
字典是无序的 键:值(key:value)对集合,键必须是互不相同的(在同一个字典内)。
1.dict内部存放的顺序和key放入的顺序没有关系。
2.dict查找和插入的速度极快,不会随着key的增加而增加,但是需要占用大量的内存。
字典的定义语法为{元素1,元素2...元素n}
1.其中一个元素是一个 键值对
2.关键点是 大括号{}, 逗号, 和冒号:
3.大括号-- 把所有元素绑在一起
4.逗号-- 把每个键值对分开
5.冒号-- 把键值分开
创建和访问字典
brand = ['李宁', '耐克', '阿迪达斯']
slogan = ['一切皆有可能', 'Just do it', 'Impossible is nothing']
print('耐克的口号是:', slogan[brand.index('耐克')])
>>>耐克的口号是: Just do it
dic = {'李宁': '一切皆有可能', '耐克': 'Just do it', '阿迪达斯': 'Impossible is nothing'}
print('耐克的口号是:', dic['耐克'])
>>>耐克的口号是: Just do it
通过字符串或数值作为key来创建字典
注意:如果我们取的键在字典中不存在,会直接报错keyerror
dic1 = {1:'one',2:'two',3:'three'}
print(dic1)
>>>{1: 'one', 2: 'two', 3: 'three'}
print(dic1[1])
>>>one
print(dic1[4])
>>>KeyError: 4
通过元组作为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'>
通过构造函数dict来创建字典
dict() 创建一个空字典
通过把可以直接把数据放入字典中,单一个key只能对应一个value,多次对一个key放入value会把前面的值冲掉。
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}
dic['d'] = 12
print(dic)
>>>{'a': 11, 'b': 2, 'c': 3, 'd': 12}
dict(mapping) 用mapping键值对初始化一个新字典
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.3字典内置方法
dict.fromkeys(seq[,value])用于创建一个新字典,以序列seq中元素做字典键,value为字典所有键对应的初始值。
seq = ('name','age','sex')
dit1 = dict.fromkeys(seq)
print("新字典为:%s" % str(dit1))
>>>新字典为:{'name': None, 'age': None, 'sex': None}
dic2 = dict.fromkeys(seq,10)
print("新字典为:%s" % str(dic2))
>>>新字典为:{'name': 10, 'age': 10, 'sex': 10}
dic3 = dict.fromkeys(seq, ('小马', '8', '男'))
print("新的字典为 : %s" % str(dic3))
>>>新的字典为 : {'name': ('小马', '8', '男'), 'age': ('小马', '8', '男'), 'sex': ('小马', '8', '男')}
dict.keys()返回一个可迭代对象,可以使用list()来转换为列表,列表为字典中的所有键。
dic = {'name':'lsp','age':7}
print(dic.keys())
>>>dict_keys(['name', 'age'])
lst = list(dic.keys())
print(lst)
>>>['name', 'age']
dict.value()返回一个迭代器,可以使用list()来转换为列表,列表为字典中的所有值。
dic = {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}
print("字典所有值为 : ", list(dic.values()))
>>>字典所有值为 : ['female', 7, 'Zara']
dict.items() 以列表返回可遍历的 (键, 值) 元组数组。
dic = {'Name': 'Lsgogroup', 'Age': 7}
print("Value : %s" % dic.items())
>>>Value : dict_items([('Name', 'Lsgogroup'), ('Age', 7)])
print(tuple(dic.items()))
>>>(('Name', 'Lsgogroup'), ('Age', 7))
dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回默认值。
dic = {'Name': 'Lsgogroup', 'Age': 27}
print("Age 值为 : %s" % dic.get('Age'))
>>>Age 值为 : 27
print("Sex 值为 : %s" % dic.get('Sex', "NA"))
>>>Sex 值为 : NA
dict.setdefault(key, default=None) 和 get() 方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
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}
key in dict in 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回 true ,否则返回 false 。而 not in 操作符刚好相反,如果键在字典 dict 里返回 false ,否则返回 true 。
dic = {'Name': 'Lsgogroup', 'Age': 7}
# in 检测键 Age 是否存在
if 'Age' in dic:
print("键 Age 存在")
else:
print("键 Age 不存在")
# 检测键 Sex 是否存在
>>>键 Age 存在
1. dict.pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。 key 值必须给出。若 key不存在,则返回 default 值。
2. del dict[key] 删除字典给定键 key 所对应的值。
dic1 = {1: "a", 2: [1, 2]}
print(dic1.pop(1), dic1)
>>>a {2: [1, 2]}
设置默认值,必须添加,否则报错
print(dic1.pop(3, "nokey"), dic1)
>>>nokey {2: [1, 2]}
del dic1[2]
print(dic1)
>>>{}
dict.popitem() 随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。
dic1 = {1: "a", 2: [1, 2]}
print(dic1.popitem())
>>>(1, 'a')
print(dic1)
>>>{2: [1, 2]}
dict.clear() 用于删除字典内所有元素。
dic = {'Name': 'Zara', 'Age': 7}
print("字典长度 : %d" % len(dic))
>>>字典长度 : 2
dict.clear()
print("字典删除后长度 : %d" % len(dic))
>>>字典删除后长度 : 0
dict.copy() 返回一个字典的浅复制。
dic1 = {'Name': 'Lsgogroup', 'Age': 7, 'Class': 'First'}
dic2 = dic1.copy()
print("新复制的字典为 : ", dic2)
>>>新复制的字典为 : {'Name': 'Lsgogroup', 'Age': 7, 'Class': 'First'}
直接赋值和 copy 的区别
dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}
引用对象
dic2 = dic1
深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
dic3 = dic1.copy()
print(id(dic1))
>>>148635574728
print(id(dic2))
>>>148635574728
print(id(dic3))
>>>148635574344
修改 data 数据
dic1['user'] = 'root'
dic1['num'].remove(1)
输出结果
print(dic1)
>>>{'user': 'root', 'num': [2, 3]}
print(dic2)
>>>{'user': 'root', 'num': [2, 3]}
print(dic3)
>>>{'user': 'lsgogroup', 'num': [2, 3]}
dict.update(dict2) 把字典参数 dict2 的 key:value 对 更新到字典 dict 里
dic = {'Name': 'Lsgogroup', 'Age': 7}
dic2 = {'Sex': 'female', 'Age': 8}
dic.update(dic2)
print("更新字典 dict : ", dic)
>>>更新字典 dict : {'Sex': 'female', 'Age': 8, 'Name': 'Lsgogroup'}