字典(dict)是python中唯一的一个映射数据类型,它是以{}括起来的键值对组成。在dict中key是唯一的,在保存的时候,根据key来计算出一个内存地址,然后将key-value保存在这个地址中,这种算法被称为hash算法。所以,切记,在dict中存储的key-value中的key必须是可hash的。如果你搞不懂什么是可哈希,暂时可以这样记,可以改变的都是不可哈希的,那么可哈希就意味着不可变,这个是为了能准确的计算内存地址?规定的。
已知的可哈希(不可变)的数据类型: int,str,tuple,bool 不可哈希(可变)的数据类型: list,dict,set
语法 :
{key1: value1, key2: value2....}
注意: key必须是不可变(可哈希)的,value没有要求,可以保存任意类型的数据。
# 合法 dic = {123: 456, True: 999, "id": 1, "name": ‘sylar‘, "age": 18, "stu": [‘帅 哥‘, ‘美?‘], (1, 2, 3): ‘麻花藤‘} print(dic[123]) print(dic[True]) print(dic[‘id‘]) print(dic[‘stu‘]) print(dic[(1, 2, 3)]) # 不合法 # dic = {[1, 2, 3]: ‘周杰伦‘} # list是可变的. 不能作为key # dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不能作为key dic = {{1, 2, 3}: ‘呵呵呵‘} # set是可变的, 不能作为key
dict保存的数据不是按照我们添加进去的顺序保存的,是按照hash表的顺序保存的,?hash表不是连续的,所以不能进?切片?作,它只能通过key来获取dict中的数据。
dic = {} dic[‘name‘] = ‘周润发‘ # 如果dict中没有出现这个key, 就会新增?个key-value的组 合进dict dic[‘age‘] = 18 print(dic)
# 如果dict中没有出现过这个key-value. 可以通过setdefault设置默认值 dic.setdefault(‘李嘉诚‘) # 也可以往??设置值. dic.setdefault("李嘉诚", "房地产") # 如果dict中已经存在了. 那么setdefault将不会 起作?
print(dic)
ret = dic.pop("jay") print(ret)
del dic["jay"] print(dic)
# 随机删除. ret = dic.popitem()
# 清空字典中的所有内容 dic.clear()
dic = {"id": 123, "name": ‘sylar‘, "age": 18} dic1 = {"id": 456, "name": "麻花藤", "ok": "wtf"} dic.update(dic1) # 把dic1中的内容更新到dic中. 如果key重名. 则修改替换. 如果不存在key, 则新增. print(dic) print(dic1)
查询?般?key来查找具体的数据.
print(dic[‘name‘]) # print(dic[‘sylar‘]) # 报错 print(dic.get("ok")) print(dic.get("sylar")) # None print(dic.get("sylar", "?B")) # ?B
dic = {"id": 123, "name": ‘sylar‘, "age": 18, "ok": "科?"}
print(dic.keys()) # dict_keys([‘id‘, ‘name‘, ‘age‘, ‘ok‘]) 不?管它是什么.当成list来?就? for key in dic.keys(): print(key)
print(dic.values()) # dict_values([123, ‘sylar‘, 18, ‘科?‘]) ?样. 也当 list来? for value in dic.values(): print(value)
print(dic.items()) # dict_items([(‘id‘, 123), (‘name‘, ‘sylar‘), (‘age‘,18), (‘ok‘, ‘科?‘)]) 这个东?也是list. 只不过list中装的是tuple for key, value in dic.items(): # ?? 这个是解构 print(key, value)
# 解构 a, b = 1, 2 print(a, b)
(c, d) = 3, 4 print(c, d)
e, f = [1, 2, 3] # 解构的时候注意数量必须匹配 print(e, f)
# 字典的嵌套 dic1 = { "name": "汪峰", "age": 18, "wife": { "name": ‘章?怡‘, "age": 28 }, "children": [‘第?个?孩?‘, ‘第?个?孩?‘], "desc": ‘峰哥不会告我吧. 没关系. 我想上头条的‘ } print(dic1.get("wife").get("name")) print(dic1.get("children")) print(dic1.get("children")[1])
a = ‘alex‘ b = ‘alex‘ print(a == b) # True n = 10 n1 = 10 print(n == n1) # True
li1 = [1,2,3]
li2 = [1,2,3]
print(li1 == li2) True
从测试来看:
== 比较的是值
id():获得内存地址
a = ‘alex‘ print(id(a)) # 36942544 内存地址 n = 10 print(id(n)) #1408197120 li = [1,2,3] print(id(li)) #38922760 #字符串 a = ‘alex‘ b = ‘alex‘ print(a is b) #True #数字 n = 10 n1 = 10 print(n is n1) #True #列表 li =[1,2,3] li2 =[1,2,3] print(li is li2) #False #元组 tu =(1,2,3) tu1 =(1,2,3) print(tu is tu1) # False #字典 dic1 = {‘name‘:‘alex‘} dic = {‘name‘:‘alex‘} print(dic1 is dic) #False
从测试来看:
is 比较的是内存地址
n = -6 n1 = -6 print(n is n1) #False n = -5 n1 = -5 print(n is n1) #True n = 257 n1 = 257 # 在pycharm中会显示true,在终端中是false,因为pycharm会做出它认为是优化的方案,但是却打破了python的功能 print(n is n1) #True
a = ‘alex@‘a1 = ‘alex@‘print(a is a1) # Fales
a = ‘a‘*21b = ‘a‘*21print(a is b) #False a = ‘aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa‘b = ‘aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa‘print(a is b) #True
ASCII码:
不支持中文
支持英文、数字、符号
8位 一个字节
GBK码 国标:
支持 中文,英文,数字,符号
英文 16位 二个字节
中文 16位 二个字节
UNICODE万国码:
支持 中文,英文,数字,符号
英文 32 位 四个字节
中文 32位 四个字节
UTF-8:
长度可变的万国码 最少用8位
英文 8位 一个字节
中文 24位 三个字节
encode(编码方式) ---- 拿到明文编码后对应的字节
decode(编码方式) -----将编码后的字节解码成对应的明文
s = ‘alex‘print(s.encode(‘utf-8‘)) # 编码 encode(‘utf-8‘) utf-8 是指定要编码成什么样的编码类型print(s1.decode(‘utf-8‘)) # s = ‘饿了‘s1 = s.encode(‘gbk‘) #b‘饿了吗‘ #b‘\xe9\xa5\xbf\xe4\xba\x86\xe5\x90\x97‘print(s.encode(‘gbk‘)) #b‘\xb6\xf6\xc1\xcb\xc2\xf0‘print(s1)print(s1.decode(‘utf-8‘))
注意: 用什么进行编码就要什么进行解码 不然后会懵逼!
python基础(8):基本数据类型三(dict)、is和==、编码和解码
原文:https://www.cnblogs.com/liuhui0308/p/11805216.html