Python——数据类型(列表、元组、字典)
一、列表
定义:[]内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素。
特性:
1.可存放多个值。
2.可修改指定索引位置对应的值,可变。
3.按照从左到右的顺序定义列表元素,下标从0开始顺序访问,有序。
1、列表创建
list_test=['lhf',12,'ok']
或
list_test=list('abc')
或
list_test=list(['lhf',12,'ok'])
2、列表常用操作
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
索引
>>> classmates[0]
'Michael'
>>> classmates[1]
'Bob'
>>> classmates[2]
'Tracy'
>>> classmates[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> classmates[-1]
'Tracy'
切片
>>> classmates[0:]
['Michael', 'Bob', 'Tracy']
>>> classmates[0::2]
['Michael', 'Tracy']
>>> classmates[:2]
['Michael', 'Bob']
>>> classmates[-2:-1]
['Bob']
>>> classmates[-2:0]
[]
>>> classmates[-3:-1]
['Michael', 'Bob']
追加
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
删除
>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']
>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']
长度
>>> len(classmates)
3
循环
>>> for i in classmates:
... print(i)
...
Michael
Bob
Tracy
包含
>>> 'Bob' in classmates
True
>>> 'ogen' in classmates
False
3、常用函数
.copy() 复制
.append() 在列表后增加元素
.insert() 在索引号前增加元素
.pop() 默认从后面删除元素
.remove() 按照元素进行删除
.index() 按照元素进行查找
.clear() 清楚列表元素,原列表为空
.count() 查找元素的个数
.extend([1,2,3]) 扩展列表,将[1,2,3]列表和原列表合成一个列表
.reverse() 将列表进行倒序
.sort() 将列表中的元素按顺序排列。字符创和数字不能同时排序。.sort(reverse=True)倒序排列。
二、元组
定义:与列表类似,只不过[]改成()
特性:
1.可存放多个值。
2.不可变。
3.按照从左到右的顺序定义元组元素,下标从0开始顺序访问,有序。
1、元组创建
ages = (11, 22, 33, 44, 55)
或
ages = tuple((11, 22, 33, 44, 55))
定义一个空的元组 t=()
定义只有1个元素的元组
t=(1) 这样t的类型就是整形
t=(1,) 这样t的类型就是元组
一个“可变的”tuple:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
定义的时候tuple包含的3个元素:
当我们把list的元素'A'和'B'修改为'X'和'Y'后,tuple变为:
表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
2、元组的操作
索引
>>> ages = (11, 22, 33, 44, 55)
>>> ages[0]
11
切片
>>> ages[0:]
(11, 22, 33, 44, 55)
>>> ages[0:3]
(11, 22, 33)
>>> ages[:3]
(11, 22, 33)
>>> ages[:3:2]
(11, 33)
>>> ages[-3:-1]
(33, 44)
循环
>>> for i in ages:
... print(i)
...
11
22
33
44
55
包含
>>> 11 in ages
True
>>> 12 in ages
False
三、字典
定义:{key1:value1,key2:value2},key-value结构,key必须可hash
特性:
1.可存放多个值。
2.可修改指定key对应的值,可变。
3.无序。
1、字典的创建
person = {"name": "sb", 'age': 18}
或
person = dict(name='sb', age=18)
person = dict({"name": "sb", 'age': 18})
person = dict((['name','sb'],['age',18]))
{}.fromkeys(seq,100) #不指定100默认为None
注意:
>>> dic={}.fromkeys(['k1','k2'],[])
>>> dic
{'k1': [], 'k2': []}
>>> dic['k1'].append(1)
>>> dic
{'k1': [1], 'k2': [1]}
2、字典的操作
索引
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
新增
>>> d['alex']=100
>>> d
{'Michael': 95, 'Bob': 75, 'Tracy': 85, 'alex': 100}
如果key不存在,就会报错。
避免key不存在的错误,有两种判断key是否存在的方式
1.通过in判断:
>>> 'Thomas' in d
False
2.通过get()判断,如果key不存在,可以返回None,或者自己指定的value:
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1
删除
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}
循环
>>> for i in d:
... print(i,d[i])
...
Michael 95
Bob 75
Tracy 85
alex 100
长度
>>> len(d)
4
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:
3、字典的常用函数
.pop(key,'str') 删除key对应的键值对,返回value。key不存在返回str。
.popitem() 随机删除键值对
.keys() 返回字典的所有key到dict_keys中。可以使用list(d.keys())
.values() 返回字典的valu到dict_values中,可以使用list(d.keys())
.items() 返回键值对。
.get(key,'str') 返回key对应的值value,key不存在返回自定义的str。
.clear() 清空字典
.copy() 复制字典
{}.fromkeys([],None) 初始化字典
.update(dict) 将新字典ditct更新到原字典中,键存在覆盖值,键不存在创建键值对
四、数据类型分类
1、可变不可变
可变:列表,字典
不可变:数字,字符串,元组
2、存放值的个数
一个值:数字,字符串
多个值(容器类型):列表,元组,字典
3、取值方式
直接取值:数字
序列类型:字符串,元组,列表
映射类型:字典
参考博客:http://www.cnblogs.com/linhaifeng/articles/5935801.html#_label16
五、练习
一、元素分类
有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
a=[11,22,33,44,55,66,77,88,99,90] dic={'k1':[],'k2':[]} for i in a: if i > 66 :dic['k1'].append(i) elif i < 66:dic['k2'].append(i) print(dic)
二、查找
查找列表中元素,移除每个元素的空格,并查找以 a或A开头 并且以 c 结尾的所有元素。
li = ["alec", " aric", "Alex", "Tony", "rain"]
tu = ("alec", " aric", "Alex", "Tony", "rain")
dic = {'k1': "alex", 'k2': ' aric', "k3": "Alex", "k4": "Tony"}
li = ["alec", " aric", "Alex", "Tony", "rain"] tu = ("alec", " aric", "Alex", "Tony", "rain") dic = {'k1': "alex", 'k2': ' aric', "k3": "Alex", "k4": "Tony"} res=[] res1=[] res2=[] for i in li: if i.strip(): i=i.strip() if i.startswith('a'or'A') and i.endswith('c'): res.append(i) print(res) tu = ("alec", " aric", "Alex", "Tony", "rain") for i in tu: if i.strip(): i=i.strip() if i.startswith('a'or'A') and i.endswith('c'): res1.append(i) print(res1) for i in dic: if dic[i].strip(): dic[i]=dic[i].strip() if dic[i].startswith('a'or'A') and dic[i].endswith('c'): res2.append(dic[i]) print(res2)
三、输出商品列表,用户输入序号,显示用户选中的商品
商品 li = ["手机", "电脑", '鼠标垫', '游艇']
li = ["手机", "电脑", '鼠标垫', '游艇'] for i,v in enumerate(li,1): print(i,v) while True: a=input('请输入序号:') if not a.isdigit() or int(a)>4 or int(a)==0: print('请重新输入数字') continue print(li[int(a)-1])
四、购物车
功能要求:
要求用户输入总资产,例如:2000
显示商品列表,让用户根据序号选择商品,加入购物车
购买,如果商品总额大于总资产,提示账户余额不足,否则,购买成功。
附加:可充值、某商品移除购物车
goods = [
{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "美女", "price": 998},
]
没看清楚题目,所以没有写可充值,删除商品的购物车。
goods = [ {"name": "电脑", "price": 1999}, {"name": "鼠标", "price": 10}, {"name": "游艇", "price": 20}, {"name": "美女", "price": 998}, ] j=1 b=[] c={} while True: qian=input('请输入您的购买金额:') if qian.strip() and qian.isdigit(): break continue for i in goods: print(j,i['name'],i['price']) c[j]=i['price'] j+=1 while True: buy=input('请输入您想购买的商品(以空格分开):') b=buy.split() s = 0 for i in b: s+=int(c[int(i)]) if s>int(qian): print('账户余额不足,差额为¥%s,请重新选择。' %(s-int(qian))) continue else: print('购买成功,余额为¥%s。' %(int(qian)-s)) break
添加了功能的购物车。
1 goods = [ 2 {"name": "电脑", "price": 1999}, 3 {"name": "鼠标", "price": 10}, 4 {"name": "游艇", "price": 20}, 5 {"name": "美女", "price": 998}, 6 ] 7 j=1 8 b=[] 9 p={} 10 n={} 11 tag=True 12 while True: 13 qian=input('请输入您的购买金额:') 14 if qian.strip() and qian.isdigit(): 15 money=int(qian) 16 break 17 continue 18 print('***************商品列表***************') 19 for i in goods: 20 print(j,i['name'],i['price']) 21 p[j]=i['price'] 22 n[j]=i['name'] 23 j+=1 24 print('***请选择商品的序号添加至购物车(每次一件,输入5完成选购)***') 25 while tag: 26 buy=input('>>>>:') 27 if not buy.strip() or not buy.isdigit() or int(buy)>5: 28 print('请输入正确序号') 29 continue 30 elif int(buy)>=0 and int(buy)<=4: 31 b.append(buy) 32 continue 33 elif buy=='5': 34 while tag: 35 print('您的购物车清单如下:') 36 if b.count('1')!=0: 37 print('名称:%s 数量:%s 价格:%s'% (n[1], b.count('1'), b.count('1')*p[1])) 38 if b.count('2')!=0: 39 print('名称:%s 数量:%s 价格:%s'% (n[2], b.count('2'), b.count('1')*p[2])) 40 if b.count('3') != 0: 41 print('名称:%s 数量:%s 价格:%s'% (n[3], b.count('3'), b.count('3')*p[3])) 42 if b.count('4')!=0: 43 print('名称:%s 数量:%s 价格:%s'% (n[4], b.count('4'), b.count('4')*p[4])) 44 s = 0 45 for i in b: 46 s+=int(p[int(i)]) 47 if s>money: 48 print('账户余额不足,差额为¥%s,请重新选择。' %(s-money)) 49 while tag: 50 print('选择充值请按c,选择删除商品请按d,退出购买请按t,重新提交请按a') 51 x=input('>>>:') 52 if not x in ['c','d','t','a']: 53 print('请重新选择功能') 54 continue 55 if x == 'c': 56 chong=input('请输入充值金额') 57 money+=int(chong) 58 break 59 if x == 'd' : 60 while True: 61 de=input('>>>>:') 62 if de == '5': 63 break 64 elif not de.strip() or not de.isdigit() or int(de) > 5 or not de in b : 65 print('请输入正确序号') 66 continue 67 elif int(de) >= 0 and int(de) <= 4 : 68 b.remove(de) 69 continue 70 if x == 'a': break 71 if x == 't':tag=False 72 else: 73 print('添加购物车成功,余额为¥%s。完成购买请按w,继续购买请按j' %(money-s)) 74 while tag: 75 k = input('>>>:') 76 if not k in ['w','j']: 77 print('请重新选择功能') 78 continue 79 if k == 'w': 80 tag=False 81 print('购物完成') 82 if k == 'j': 83 break 84 break
优化一:
1 goods = [ 2 {"name": "电脑", "price": 1999}, 3 {"name": "鼠标", "price": 10}, 4 {"name": "游艇", "price": 20}, 5 {"name": "美女", "price": 998},] 6 j=1 7 b=[] 8 p={} 9 n={} 10 tag=True 11 while True: 12 qian=input('请输入您的购买金额:') 13 if qian.strip() and qian.isdigit(): 14 money=int(qian) 15 break 16 continue 17 print('***************商品列表***************') 18 for i in goods: 19 print(j,i['name'],i['price']) 20 p[str(j)]=i['price'] 21 n[str(j)]=i['name'] 22 j+=1 23 print('***请选择商品的序号添加至购物车(每次一件,输入5完成选购)***') 24 while tag: 25 buy=input('请输入您选购商品的序号:') 26 if not buy in ['1','2','3','4','5']: 27 print('请输入正确序号') 28 continue 29 elif int(buy)>=0 and int(buy)<=4: 30 b.append(buy) 31 continue 32 elif len(b)==0: 33 print('购物车为空') 34 continue 35 elif buy=='5': 36 while tag: 37 print('您的购物车清单如下:') 38 if b.count('1')!=0: 39 print('名称:%s 数量:%s 价格:%s'% (n['1'], b.count('1'), b.count('1')*p['1'])) 40 if b.count('2')!=0: 41 print('名称:%s 数量:%s 价格:%s'% (n['2'], b.count('2'), b.count('2')*p['2'])) 42 if b.count('3') != 0: 43 print('名称:%s 数量:%s 价格:%s'% (n['3'], b.count('3'), b.count('3')*p['3'])) 44 if b.count('4')!=0: 45 print('名称:%s 数量:%s 价格:%s'% (n['4'], b.count('4'), b.count('4')*p['4'])) 46 s = 0 47 for i in b: 48 s+=p[i] 49 if s>money: 50 print('账户余额不足,差额为¥%s,请重新选择。' %(s-money)) 51 while tag: 52 print('选择充值请按c,选择删除商品请按d,退出购买请按t,重新提交请按a') 53 x=input('>>>:') 54 if not x in ['c','d','t','a']: 55 print('请重新选择功能') 56 continue 57 if x == 'c': 58 chong=input('请输入充值金额:') 59 money+=int(chong) 60 break 61 if x == 'd' : 62 while True: 63 print('您的购物车清单如下:') 64 if b.count('1') != 0: 65 print('序号:1 名称:%s 数量:%s 价格:%s' % (n['1'], b.count('1'), b.count('1') * p['1'])) 66 if b.count('2') != 0: 67 print('序号:2 名称:%s 数量:%s 价格:%s' % (n['2'], b.count('2'), b.count('1') * p['2'])) 68 if b.count('3') != 0: 69 print('序号:3 名称:%s 数量:%s 价格:%s' % (n['3'], b.count('3'), b.count('3') * p['3'])) 70 if b.count('4') != 0: 71 print('序号:4 名称:%s 数量:%s 价格:%s' % (n['4'], b.count('4'), b.count('4') * p['4'])) 72 print('您的余额为%s' % (money - int(b.count('1') * p['1']) - int(b.count('2') * p['2']) - int( 73 b.count('3') * p['3']) - int(b.count('4') * p['4']))) 74 de=input('请输入要删除物品的序号(输入5结束):') 75 if de == '5': 76 print('删除完成') 77 break 78 elif not de in ['1','2','3','4','5'] or not de in b : 79 print('购物车中无对应的商品') 80 continue 81 elif int(de) >= 0 and int(de) <= 4 : 82 b.remove(de) 83 continue 84 if x == 'a': break 85 if x == 't': 86 tag=False 87 print('退出购买,您的余额为¥%s' %money) 88 else: 89 print('添加购物车成功,余额为¥%s。\n完成购买请按w,继续购买请按j' %(money-s)) 90 while tag: 91 k = input('请输入您的选择:') 92 if not k in ['w','j']: 93 print('请重新选择功能') 94 continue 95 if k == 'w': 96 tag=False 97 print('购物完成') 98 if k == 'j': 99 break 100 break
选做题:用户交互,显示省市县三级联动的选择
dic = {
"河北": {
"石家庄": ["鹿泉", "藁城", "元氏"],
"邯郸": ["永年", "涉县", "磁县"],
}
"河南": {
...
}
"山西": {
...
}
}
dic = { "河北": { "石家庄": ["鹿泉", "藁城", "元氏"], "邯郸": ["永年", "涉县", "磁县"], }, "河南": { "郑州": ["上街", "中牟", "新密"], "三门峡": ["渑池", "陕县", "卢氏"], }, "山西": { "太原": ["清徐", "阳曲", "古交"], "大同": ["阳高", "广灵县", "浑源"], } } print('可查询省份:河北、河南、山西....') while True: sheng=input('请输入你所要查询的省份:') if not sheng in dic: print('输入错误') continue break for a in dic[sheng]: print(a,end=' ') print() while True: shi=input('请输入你所要查询的城市:') if not shi in dic[sheng]: print('输入错误') continue break for b in dic[sheng][shi]: print(b,end=' ')

浙公网安备 33010602011771号