【04第四章】 Python中的组合数据类型【非常重要】
4.1 索引
【代码01】4.1索引
#coding: utf-8
s='helloworld'
for i in range(0,len(s)):
print(i,s[i])
print('-------------------------------------')
#反向递减
for i in range(-10,0):
print(i,s[i])
4.2 序列的切片操作
【代码01】4.2序列的切片操作
# coding : utf-8
s='HelloWorld'
s1=s[0:5:1] #索引从0开始,到球5结束,步长为1
print(s1)
#省略开始位置start,默认从0开始
print(s[:5:1])
#省略开始位置start..省略步长step
print(s[:5])
#省略结束位置
print(s[0::1])#省略结束位置和步长
print(s[5:])#更换一下步长
print(s[0:5:2])#从0开始,到 5结束(不包含新5)步长为2
#省略开始位置和结束位置,只写步长
print(s[::2])#0,2,4,6,8位置上的元素
#步长可以为负数
print(s [ : :-1])
4.3 序列的相关操作_操作符_函数
【代码01】4.3序列的相关操作_操作符_函数
#coding: utf-8
s= 'Hello'
s2='World'
print(s+s2) #产生一个新的字符串序列
#注意事项目+左右的数据类型相同,序列中元素的数据类型可以不同
lst=[10,20,30,'PHP']#列表属于序列
#print(s+lst) #TypeErron: can only concatenate str (not ."Zlist" ) to str
#序列的相乘操作
print(s*5)
print( ' ---------------')
print( '*-'*20)
【代码02】4.3序列的相关操作_操作符_函数
# coding: utf-8
s= 'helloworld'
print( 'e在helloworld中存在吗? ',('e' in s))
print( 'v在helloworld中存在吗? ',('v' in s))
print( 'e不在helloworld中存在吗? ',('e' not in s))
print( 'v不在helloworld中存在吗? ',('v' not in s))
#内置的函数
print('len():',len(s))
print('max():',max(s))
print('min():',min(s))
#序列对象的方法..使用序列的名称,打点调用
print( 's.index() ' , s.index( 'o'))#o第一次出现的位置是索引的位置
print( 's.count()' ,s.count('o')) #统计o在字符串序列s中出现的次数
4.4 列表的创建与删除
【代码01】4.4列表的创建与删除
#coding : utf-8]
#直接使用创建
lst=[ 'hello ' , 'world' ,99.8,100]
print(lst)
#可以使用内置的ist()函数创建列表
lst2=list( 'helloworld')
lst3=list(range(1,10,2))#从1开始,到10结束(不包含10).步长为2.
print(lst2)
print(lst3)
#列表中序列中的一种,对序列操作的运算符,操作符,函数均可以使用
print(lst+lst2+lst3) #序列中的相加操作
print(lst*3)#相乘的操作
print(len(lst))
print(max(lst3))
print(min(lst3))
print(lst2.count( 'o'))#统计o的个数
print(lst2.index( 'o'))#o在列表st2中第一次出现的位置
#列表的删除操作
lst4=[10,20,30]
print(lst4)#删除列表
del lst4
print(lst4) #name 'lst4' is not defined.
4.5 列表元素的遍历
【代码01】4.5列表元素的遍历
#coding : utf-8
lst=[ 'hello' , 'world ' , 'python' , 'php' ]#使用遍历循环for遍历列表元素
for item in lst:
print(item)
#使用for循环, range()函数,len()函数,根据索引进行遍历
for i in range(len(lst)):
print(i, '-->',lst[i])
#使用for循环与enumerate(函数,进行遍历
for index , item in enumerate(lst): #默认序号从0开始
print(index ,item)
print('*-'*20)
##可以修改
for index,item in enumerate(lst,10):#序号从10开始
print(index,item)
4.6 列表元素的新增_删除_修改操作
【代码01】4.6列表元素的新增_删除_修改操作
#coding : utf-8
lst=[ 'hello' , 'world' , ' python' ]
print('原列表: ',lst,id(lst))
#新增元素的操作
#新增元素的操作
lst.append( 'sql')
print('增加元素之后',lst,id(lst))
#使用insert(index , x)在指定的位置上插入元素
lst.insert(1,100)
print(lst)
#列表元素的删除操作
lst.remove( 'world' )
print('删除元素之后的列表',lst,id(lst))
#使用pop(index)根据索引移出元素.先将元素取出,再将元素删除
print(lst.pop(1))
print(lst)
#列表反向
lst.reverse()
print(lst)
#列表的拷贝,将产生一个新的列表对象
new_lst=lst.copy()
print(lst,id(lst))
print(new_lst, id(new_lst) )
#列表元素的修改
#根据索引进行修改元素
lst[1]='mysql'
print(lst)
#清除列表中所有的元素clear
lst.clear()
print(lst,id(lst))
4.7 列表的排序操作sort方法与sorte…
【代码01】4.7列表的排序操作sort方法与sorte…
# coding: utf-8
lst=[4,56,3,78,40,56,89]
print('原列表: ',lst)
#排序,.默认是升序
lst.sort() #lst.sort(reverse=False),这也是升序
print('升序:',lst)
#排序,降序
lst.sort(reverse=True)
print('降序:',lst)
print('--'*20)
lst2=['banana', 'apple', 'Cat', 'Orange'] ##注意0和O的区别
print('原列表: ' ,lst2)
lst2.sort()
print('升序:',lst2)
#降序
lst2.sort(reverse=True)
print('降序:',lst2)
print('--'*20)
#忽略大小写进行比较
lst2.sort(key=str. lower)
print('降序:',lst2)
【代码02】4.7列表的排序操作sort方法与sorte…
# coding: utf-8
lst=[4,56,3,78,40,56,89]
print('原列表: ',lst)
#排序
asc_lst=sorted(lst)
print('升序:' , asc_lst)
print('原列表:',lst)
#降序
desc_lst=sorted (lst, reverse=True)
print('升序:' , desc_lst)
print('原列表:',lst)
lst2=['banana', 'apple', 'Cat', 'Orange'] ##注意0和O的区别
#忽略大小写的排序
new_lst2=sorted(lst2,key=str.lower)
print( '原列表: ',lst2)
print( '排序后的列表:',new_lst2)
4.8 列表生成式
还有另外一个名字,列表推导式。
【代码01】4.8列表生成式
# coding : utf-8
import random
lst=[item for item in range(1,11)]
print(lst)
lst=[item*item for item in range(1,11)]
print(lst)
lst=[random.randint(1,100) for _ in range(10)] ###item是循环变量,这里是随机数字用不上循环变量,因此用_表示。这里代表执行次数。
print(lst)
#### for之前叫做表达式
#从表表中选择符合条件的元素组成新的列表
lst=[i for i in range(10) if i%2==0] ##range(10)表示0-9
print(lst)
4.9 二维列表
【代码01】4.8 列表生成式
#coding : utf-8
#创建二维列表
lst=[
['城市','环比','同比'],
['北京',102,103],
['上海',104,504],
['深圳',100,391]
]
print(lst)
#
for row in lst:#行
for item in row:#列
print(item , end= '\t ')
print()#换行
#列表生成一个四行五列
lst2=[[j for j in range(5)] for i in range(4)] ##【ZDJ】先执行后面的,然后在执行前面的。4行5列
print(lst2)
for row in lst2:#行
for item in row:#列
print(item , end= '\t ')
print()#换行
4.10 元组的创建与删除
列表可变,元组不可变。
【代码01】4.10元组的创建与删除
#coding : utf-8#直接使用()创建元组
t=( 'hello',[10,20,30], 'python' , 'world' )
print(t)
#使用内置tuple()创建元组
t=tuple( 'helloworld' )
print(t)
t=tuple([ 10,20,30,40])
print(t)
t=tuple(range(1,10))
print(t)
#元组的相关操作
print( '10在元组中是否存在:',(10 in t))
print( '10在元组中不存在: ',(10 not in t))
print( 'max : ' ,max(t))
print( 'min: ' ,min(t))
print( 'len: ' ,len(t))
print( 't.index : ' ,t.index(1))
print( 't.count: ' ,t.count(3))
x=(10)
print(x,type(x))
y=(10,)#元组小只有一个元素,逗号不能省,省略了就是整数类型。
print(y ,type(y))
#元组的删除
del t
print(t) #name 't' is not defined
4.11 元组的访问与遍历
【代码01】4.11元组的访问与遍历
# coding : utf-8
t=( 'python ' , 'hello' , 'world ' )
print(t[0])#根据索引访问
t2=t[0:3:2]#元组支持切片操作
print(t2)
#元组的遍历
for item in t:
print(item)
#for+range() +len()组合追历
for i in range(len(t)):
print(i,t[i])
#使用enumerate()
for index,item in enumerate(t):
print(index,'--->' ,item)
print('-'*30)
for index,item in enumerate(t,5):
print(index,'--->' ,item)
4.12 元组生成式
这是元组合列表不同的地方
区别:for item in t:
print(item) ##什么也没有,需要重新去生成生成器对象
【代码01】4.12元组生成式
#coding : utf-8
t=( i for i in range(1,11)) #结果是一个生成器对象,里面的东西是看不到的,继续转换才能看到
print(t)
t=tuple(t)
print(t) #(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 可以使用for循环遍历出来。
#coding : utf-8
t=( i for i in range(1,4)) #结果是一个生成器对象,里面的东西是看不到的,继续转换才能看到
print(t)
print('-'*30)
t=tuple(t)
print(t) #(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 可以使用for循环遍历出来。
for item in t:
print(item)
print('*-'*15)
t=( i for i in range(1,4))
# __next__()方法 #也可以
print(t.__next__()) #1
print(t.__next__()) #2
print(t.__next__()) #3
print('-'*30)
t=tuple(t)
print(t) #1-3取完后是一个空的元组。
print('-'*30)
###如果不注释掉for循环,(前面有for循环),那么
for item in t:
print(item) ##什么也没有,需要重新去生成生成器对象
4.13 元组与列表的区别
元组只能访问,不能修改,增加等
4.14 字典的创建与删除
可变序列,可以添加或删减。
【代码01】4.14字典的创建与删除
#coding : utf-8#(1)直接使用子创建
d={10: 'cat' , 20: 'dog' ,30: 'pet' ,20:'zoo'} # key相同,值进行覆盖
print(d)
#zip函数的使用
lst1=[10,20,30,40]
lst2=[ 'cat' , 'dog' , 'car' , 'zoo' ]
zipobj=zip(lst1,lst2) ##映射函数的结果是一个zip对象
#print(zipobj)
#print(list(zipobj))
print('*'*20)
d=dict(zipobj)
print(d)
#使用参数创建字典
d=dict(cat=10,dog=20) # 注意事项,参数相当于变量,变量的名字不加引号.【ZDJ】倒过来不行,10=cat会报错。
print(d)
t=(10,20,30)#创建一个元组
print({t:10})
#lst=[10,20,30] #TypeError: .unhashable type: .'list'
#print({lst:10}) #因为列表是可变数据类型,可变数据不能做键。
#字典属于序列类型
print('max:',max(d))
print('min:',min(d))
print('len:',len(d))
#字典的删除
del d
print(d)
4.15 字典元素的访问和遍历
【代码01】4.15 字典元素的访问和遍历
#coding:utf-8
d={ 'hello' :10, 'world' :20, 'python' : 30}
#访问字典中的元素
#(1)使用[key]
print(d[ 'hello' ])
#..(2.)使用d .get(key)
print(d.get( 'hello'))
#二者之间是有区别的,如果Key不存在时d[key]报错,而使用get(key)可以指定默认值
# print(d[ 'java' ]) #KeyError:..'java '
print(d.get( 'java' )) #None
print(d.get( 'java','这个值不存在'))
#字典的遍历
for item in d.items():
print(item) #key-value组成的一个元组
#在使用于or循环遍历时,分别获取key和ivalue
for key , value in d.items():
print(key, value)
4.16 字典的相关操作
【代码01】4.16字典的相关操作
# coding: utf-8
d={1001:'李梅',1002:'王华',1003:'张峰'}
print(d)
#向字典中添加数据
d[1004]='张丽丽'#直接使用赋值运算符=向字典中添加元素
print(d)
#获取字典中所有的key
keys=d.keys() # d.keys()结果是dict_keys , Python中的一种内部数据类型,专用于表示字典的key
#如果希望更好的显示数据,可以使用list或者tuple转成相应的数据类型
print(keys)
print(list(keys))
print(tuple(keys))
#获取字典中所有的value
values=d.values() #dict_values
print(values)
print(list(values))
print(tuple(values))
#字典遍历的时用到的一个方法items
items=d.items() #dict_itemsl
print(items)
print(list(items))
print(tuple(items))
lst=list(items)#将字典中的数据转成键-值对的形式,以元组的方式进行展示
print(lst)
#直接可以使用dict函数将[(1001, '李梅'), (1002, '王华'), (1003, '张峰'), (1004, '张丽丽')]转成字典
d=dict(lst)
print(d)
#使用pop函数 ##可以指定特定值
print(d.pop(1001))
print(d)
print(d.pop(1008,'不存在')) #如果Key不存在,结果输出默认值"不存在”
#随机删除
print(d.popitem())#先获取key-value对
print(d)
#清空字典中所有的元素
d.clear()
print(d)
#Python中一切皆对象,而每一个对象都一个布尔值,只有个别的几个值是false
print(bool(d))#空字典的bool值为False
4.17 字典生成式
【代码01】4.17字典生成式
# coding : utf-8
import random
d={item :random.randint(1,100) for item in range(4)}
print(d)
#创建两个列表
lst=[1001,1002,1003]
lst2=['陈梅梅','王一一','李丽丽']
d={key:value for key , value in zip(lst,lst2)}
print(d)
4.18 集合的创建与删除
这里只讲可变的。
【代码01】4.18集合的创建与删除
#coding : utf-8]#使用直接创建集合
s={10,20,30,40} ##无序的
print(s)
#s={[10,20],[30,40]} #TypeError: unhashable type: 'list' ##列表是可变的,因此会报错
print(s)
##如果是元组则可以,但是元组里面有列表的话也不可以。
s={(10, 20),(20,30)}
print(s)
#s={([10, 20]),([20,30])} #TypeError: unhashable type: 'list'
print(s)
s= {}#创建的是字典还是集合呢?
print(type(s)) #<class ' dict' >
#如何创建空集合
s=set()
print(type(s),bool(s))
#第二种创建集合的方式
set()
s=set( 'helloworld' )
s2=set([10,20,30])
s3=set(range(1,10))
print(s) ## 可以去重
print(s2)
print(s3)
#集合属于序列中的一利
print('max:',max(s3))
print('min:',min(s3))
print('len:',len(s3))
print( '9在集合中是否存在? ',(9 in s3))
print( '9在集合中不存在? ',(9 not in s3))
#集合的期除
del s3
print(s3) #NameError: name 's3' is not defined
4.19 集合的操作符
【代码01】4.19集合的操作符
#coding : utf-8
A={10,20,30,40,50}
B={30, 50,88,76,20}
#交集操作
print(A&B)
#并集
print(A|B)
#差集
print(A-B)
#补集
print(A^B)
4.20 集合的相关操作方法_集合的…
【代码01】4.20集合的相关操作方法_集合的…
#coding : utf-8
s={10,20,30}#向集合中添加元素
s.add (100)
print(s)
#删除元素
s.remove(20)
print(s)
#清除集合中所有元素
#s.clear()
#print(s, '空集合的布尔值:', bool(s)) #set() 空集合的布尔值: False
#遍历集合
for item in s:
print(item)
for index ,item in enumerate(s,10): #index在这里只是一个符号,不是索引。#10表示的是元素的序号,不是索引,从几开始可以自定义
print(index,'-->',item)
#集合的生成式
s={i for i in range(10)}
print(s) #{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 这里是散列的顺序。
s= {i for i in range(10) if i%2}
print(s)
4.21 组合数据类型的总结
4.22 课堂练习
4.23 实战一:千年虫
【代码01】 4.23 实战一:千年虫
#coding : utf-8
lst=[88,89,90,98,00,99]#表示的员工的两位整数的出生年份
print('原列表:',lst)
'''
#遍历列表
for index in range(len(lst)):
if str(lst[index])!='0':
lst[index]= '19'+str(lst[index])#拼接年份之后,.再赋值
else:
lst[index]='200'+str(lst[index])
#修改后的年份列表
print(lst)
'''
#使用enumerate 函数遍历列表
for index, value in enumerate(lst) :
if str(value)!='0':
lst[index]='19'+str(value)
else:
lst[index]='200'+str(value)
print(lst)
4.24 实战二-模拟京东购物流程
【代码01】4.24实战二-模拟京东购物流程
#coding : utf-8
lst=[]
for i in range(5):
goods=input( '请输入商品的编号和商品的名称进行商品入库,每次只能输入一件商品: ')
lst.append(goods)
#输出所有的商品信息
for item in lst:
print(item)
#创建一个列表空列表,用于存储购物车中的商品
cart=[]
while True:
flag = False # 代表没有商品的情况【后面加上去的】
num=input('请输入要购买的商品编号:')
#遍历商品列表,查询一下要购买的商品是否存在
for item in lst:
if num==item[0:4]:
flag = True # 代表商品已找到【后面加上】
cart.append(item)#添加到购物车列表
print('商品已成功添加到购物车:')
break #退出的是for循环
if flag == False and num!='q': # flag==False简写写法not flag #if not flag and num!='q': 【后面加上】
print('商品不存在!')
if num=='q':
break#退出的是while循环
print('您购物车里已选择的商品为:')
#反向
cart.reverse()
for item in cart:
print(item)
4.25实战三-模拟12306火车票购票.
【代码01】4.25实战三-模拟12306火车票购票.
#coding : utf-8
#创建字典,用于存储车票的信息,使用车次作key,使用其它信息作为value
dict_ticket={
'G1569':['北京南-天津南','18:06','18:39','00:33'],
'G1567':['北京南-天津南','18:15','18:49','00:34'],
'G8917':['北京南-天津西','18:20','19:19','00:59'],
'G203 ' :['北京南-天津南','18:35','19:09','00:34']
}
print('车次 出发站-到达站 出发时间 到达时间 历时时长')
#遍历字典中的元素
for key in dict_ticket.keys() :
print(key,end=' ')#为什么不换行...因为车次和车次信息在一行输出#遍历车次的详细信息,是一个列表
for item in dict_ticket.get(key):#根据key获取值dict_ticket[key]
print(item,end=' ')
# 换行
print()
#输入用户的购票车次
train_no=input('请输入要购买的车次:')#根据key获取值
info=dict_ticket.get(train_no,'车次不存在') # info表示的是车次信息
#判断车次是否存在
if info!='车次不存在':
person=input('请输入乘车人,如果是多位乘车人使用逗号分隔:')#获取车次的出发站-到达站,还有出发时间
s=info[0]+' '+info[1] +'开'
print('您已购买了'+train_no+' '+s+'请'+person+'尽快换取纸制车票。【铁路客服】')
else:
print(info)
4.26 实战四-模拟手机通迅录
【代码01】4.26实战四-模拟手机通迅录
#coding: utf-8
# #创建一个空集合
phones=set()
#录入5位好友的姓名和手机号
for i in range(1,6):
info=input('请输入第'+str(i)+'位好友的姓名与手机号码:')
#添加到集合中
phones.add(info)
#遍历集合
for item in phones:
print(item)