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个元素:

tuple-0

当我们把list的元素'A''B'修改为'X''Y'后,tuple变为:

tuple-1

表面上看,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有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

而list相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

所以,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  

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143167793538255adf33371774853a0ef943280573f4d000

五、练习

一、元素分类

有如下值集合 [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=' ')
参考答案

 

posted @ 2017-06-08 15:58  maple-shaw  阅读(541)  评论(0)    收藏  举报