字典dict
1、数据类型划分:可变数据类型,不可变数据类型
(1)不可变数据类型(可哈希):str、int、bool、元组
(2)可变数据类型(不可哈希):dict、list、set
2、dict:
key必须是不可变数据类型:可哈希,键一般是唯一的,如果重复,会替换前面的,值不需要唯一
value可以是任意数据类型
3、dict优点:
(1)二分查找去查询
(2)存储大量关系型数据
特点:无序的(即没有索引,python3.5之前没有)
4、字典是另一种可变容器模型,且存储任意类型的对象
字典的每个键值key==>value对用冒号:分割,每个键值对之间用,逗号分割,整个字典包括在花括号{}中,格式如下:
d = {key1 : value1, key2 : value2 }
5、访问字典中的值(查看)
dict_check = {'age':18,'name':'江河','heigh':170,'weight':140}
# 查看字典中所有的key,以列表形式展示
print(dict_check.keys()) # dict_keys(['age', 'name', 'heigh', 'weight'])
# 查看字典中所有的value,以列表形式展示
print(dict_check.values()) # dict_values([18, '江河', 170, 140])
# 通过items()查的是键和值,返回的是列表,键和值由元组组成
print(dict_check.items()) # dict_items([('age', 18), ('name', '江河'), ('heigh', 170), ('weight', 140)])
# 查看某一个key的值,如果key不存在报错
value = dict_check['name']
print(value)
# 使用get()方法查看值,key不存在,默认返回None
value = dict_check.get('cs')
print(value) # None
# for循环查看字典中所有的键值
dict_check = {'age':18,'name':'江河','heigh':170,'weight':140}
for key,value in dict_check.items():
print(key,value)
6、字典中键值对的增加操作
dict_check = {'age':18,'name':'江河','heigh':170,'weight':140}
# 如果添加的字典中无相同的键,则添加新的键值对
dict_check['address'] = '北京'
print(dict_check)
# 如果添加的字典中有相同的键,则覆盖之前的值
dict_check['age'] = 20
print(dict_check)
# setdefault()方法由键值对,不做任何改变,没有才添加
dict_check.setdefault('name','jh')
print(dict_check)
dict_check.setdefault('come','来')
print(dict_check)
dict_check.setdefault('hand') # 不添加值,默认是None,有返回值为默认值None
print(dict_check)
7、字典中键值对的删除操作
dict_check = {'age':18,'name':'江河','heigh':170,'weight':140}
# del 删除键值和整个字典
del dict_check['age']
print(dict_check)
dict_check.clear() # 清空字典
print(dict_check)
del dict_check # 删除字典
print(dict_check)
8、字典中键值对的修改操作
dict_check = {'age':18,'name':'江河','heigh':170,'weight':140}
dict_check['age'] = 19
print(dict_check)
dict_check = {'age':18,'name':'江河','heigh':170,'weight':140}
dict_check_1 = {'age_1':10}
dict_check_1.update(dict_check) # 更新字典
print(dict_check)
print(dict_check_1)
#面试题:用一行代码互换a、b的值
a = 1
b = 2
a,b = b,a
print(a,b)
===========================字典嵌套============================
8、例子:
dic = {
'name': ['alex','wusir','taibai'],
'py9': {
'time': '1213',
'learn_money': 19800,
'addr': 'CBD',
},
'age': 21
}
dic['age'] = 56
dic['name'].append('jianghe')
dic['name'][2] = dic['name'][2].upper()
print(dic)
# {'name': ['alex', 'wusir', 'TAIBAI', 'jianghe'], 'py9': {'time': '1213', 'learn_money': 19800, 'addr': 'CBD'}, 'age': 56}
============================作业==========================
1、有如下值li= [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中, 将小于 66 的值保存至第二个key的值中。即: {'k1': 大于66的所有值列表, 'k2': 小于66的所有值列表}
li= [11,22,33,44,55,66,77,88,99,90]
dic = {}
dic_key1 = []
dic_key2 = []
for i in li:
if i>66:
dic_key1.append(i)
else:
dic_key2.append(i)
dic['k1'] = dic_key1
dic['k2'] = dic_key2
print(dic)
# {'k1': [77, 88, 99, 90], 'k2': [11, 22, 33, 44, 55, 66]}
2、
购物选择
(1)输出商品列表,用户输入序号,显示用户选中的商品
商品 li = ["手机", "电脑", '鼠标垫', '游艇']
要求:<1>:页面显示 序号 + 商品名称,如:
**手机
**电脑
<2>: 用户输入选择的商品序号,然后打印商品名称
<3>:如果用户输入的商品序号有误,则提示输入有误,并重新输入。
<4>:用户输入Q或者q,退出程序。
while 1:
li = ["手机", "电脑", '鼠标垫', '游艇']
for i in li:
li_1 = li.index(i) + 1 # 求索引index()
print(('{li_1}\t\t{i}'.format(li_1=li_1, i=i))) # 格式化输出
goods_input = input('请输入序号:')
if goods_input.isdigit():
goods_input = int(goods_input)
if goods_input < len(li) and goods_input>0:
print(li[goods_input-1])
else:
print('请输入有效数字')
elif goods_input.lower() == 'q':
break
else:
print('请输入数字:')
3、购物车(全部)
li = [{'name':'苹果','price':10},
{'name':'香蕉','price':20},
{'name':'橘子','price':30},]
shopping_car = {}
print('欢迎光临!')
money = input('查看是否有钱?')
if money.isdigit() and int(money)>0:
while 1:
for i,element in enumerate(li):
print('序号{},商品{},价格{}'.format(i,element['name'],element['price']))
choose = input('请输入您要购买的商品序号:')
if choose.isdigit() and int(choose)<len(li):
num = input('请输入你要购买的商品数量:')
if num.isdigit() and 1<int(num):
if li[int(choose)]['price']*int(num) <=int(money):
money = int(money) -int(li[int(choose)]['price'])*int(num)
if li[int(choose)]['price'] in shopping_car:
shopping_car[li[int(choose)]['name']] = shopping_car[li[int(choose)]['name']] + int(num)
else:
shopping_car[li[int(choose)]['name']] = int(num)
print('购物车中商品有{},您的余额为{}'.format(shopping_car,money))
else:
print('没钱,来干嘛!')
break
else:
print('非序号,请重新输入序号:')
else:
print('非数字,请输入正确的数字:')
===========================小知识点总结========================================
1、
(1)python2:默认编码方式是ASCII码;python3:默认编码方式utf-8
(2)ASCII:是由字母、数字和特殊字符构成,一个字节=8位bit(每个字母、数字或特殊字符为一个字节)
unicode:万国码,一开始是16位,两个字节构成
现状:32位,4个字节构成(由字母、数字、特殊字符和中文构成)每个字符都是4个字节
utf-8:unicode的升级版,至少由一个字节构成
字母、数字、特殊字符为一个字节
中文24位,每个中文3个字节
gbk:由ascii码演变的,只有中国本土用
数字、字母、特殊字符为一个字节
中文为2个字节(window默认是gbk)
(3)python2的不同之处:
如:print('字符串') 和 print '字符串' 两者都可以打印
xrange()是生成器,python3没有
raw_input() # 用户输入
(4)python3:
print('字符串') # 可以打印,其他方式错误
input() # 用户输入
2、
(1)= 是赋值;== 比较值是否相等; is 比较(比较的是内存地址)
方法:id(内容) 例子:如
li1 = [1,2,3]
li2 = li1
li3 = li2
print(id(li1),id(li2)) # 内存地址相等
print(li1 is li2) # True
3、编码:
(1)ASCII码:
A:00000010 8位 一个字节
(2)unicode:
A:00000000 00000001 00000010 00000100 32位 四个字节
中:00000000 00000001 00000010 00000110 32位 四个字节
(3)utf-8
A : 00100000 8位 一个字节
中: 00000001 00000010 00000110 24位 三个字节
(4)gbk
A : 00000110 8位 一个字节
中: 00000010 00000110 16位 两个字节
(注意:各个编码之间的二进制,是不能相互识别的,会产生乱码
文件的存储、传输,不能用unicode(只能用utf-8、、gbk、gb2312、ascii等))
4、python3
(1)str 在内存中是用unicode编码
(2)bytes类型
对于英文:
str:表现形式:s = 'alex'
编码形式:010101010 unicode
bytes:表现形式:s = b'alex'
编码形式:000101010 utf-8、gbk等
对于中文:
str:表现形式:s = '中国'
编码形式:010101010 unicode
bytes:表现形式:s = b'x\e91\e91\e01\e21\e31\e32'
编码形式:000101010 utf-8、gbk等
(3)例子:
# 英文
s = 'alex'
s1 = b'alex'
print(s,type(s)) # alex <class 'str'>
print(s1,type(s1)) # b'alex' <class 'bytes'>
# 中文
s = '中国'
print(s,type(s))
s1 = b'中国' # 正确的表现形式是:s1 =b'\xe4\xb8\xad\xe5\x9b\xbd'
print(s1,type(s1))
# File "E:/wj/test_project1/cs_python.py", line 69
# s1 = b'中国'
# ^
#SyntaxError: bytes can only contain ASCII literal characters.
(4)字符串编码转换
encode编码,如何将str--->bytes
字符串英文:unicode转换bytes类型
s1 = 'alex'
s11 =s1.encode('utf-8')
s12 = s1.encode('gbk')
print(s11,type(s11)) # b'alex' <class 'bytes'>
print(s12,type(s12)) # b'alex' <class 'bytes'>
字符串中文:unicode转换bytes类型
s1 = '中国'
s11 =s1.encode('utf-8')
s12 = s1.encode('gbk')
print(s11,type(s11)) # b'alex' <class 'bytes'>
print(s12,type(s12)) # b'alex' <class 'bytes'>
===============================基础数据类型汇总================================
1、
(1)str字符串补充:检测字符串是否只由空格组成。:str.isspace()
s = ' '
print(s.isspace()) # True
s1 = ''
print(s1.isspace()) # False
(2)list列表(条件删除)
例子:lis = [11,22,33,44,55]删除列表中奇数
j = 0
for i in lis:
if i%2 == 1:
del lis[lis.index(i)-j]
i += 1
print(lis)
lis = lis[1::2]
print(lis)
li1 = []
for i in lis:
if i%2 == 0:
li1.append(i)
lis = li1
print(lis)
(3)使用方法
dict.fromkeys(seq[, value]) # seq -- 字典键值列表。value -- 可选参数, 设置键序列(seq)的值。
字典 fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。
dic = dict.fromkeys([1,2,3,4],'cs')
print(dic) # {1: 'cs', 2: 'cs', 3: 'cs', 4: 'cs'}
(4)通过字典dic查找到键的值为列表,通过用列表中append()方法添加键值
dic = {1: [], 2: [], 3: [], 4: []}
print(dic)
dic[1].append('测试')
print(dic)
(5)去除键中含k的键值
dic = {'k1':'v1','k2':'v2','a3':'v3'}
# 第一种方法
dic = {'k1':'v1','k2':'v2','a3':'v3'}
dic1 = {}
for i in dic.keys():
if 'k' not in i:
dic1[i] = dic[i]
dic = dic1
print(dic)
# 第二种方法
dic = {'k1':'v1','k2':'v2','a3':'v3'}
li = []
for i in dic.keys():
if 'k' in i:
li.append(i)
for i in li:
del dic[i]
print(dic)
(6)转换成bool值为False的类型
# 转换成bool值为False的类型
print(bool([]))
print(bool(''))
print(bool(()))
print(bool({}))
print(bool(set()))
(7)元组:如果元组里面只有一个元素且不加逗号,那此元素是什么类型,就是什么类型
例子:
print(type((1))) # <class 'int'>
print(type((1,))) # <class 'tuple'>
print(type((''))) # <class 'str'>
print(type(({}))) # <class 'dict'>