本节内容
- 列表、元组操作
- 字符串操作
- 字典操作
1. 列表、元组操作
列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作
定义列表
|
1 |
names = ['Kkk',"Tenglan",'Eric'] |
通过下标访问列表中的元素,下标从0开始计数
|
1 2 3 4 5 6 7 8 |
>>> names[0] 'Kkk' >>> names[2] 'Eric' >>> names[-1] #最后一个 'Eric' >>> names[-2] #还可以倒着取 'Tenglan' |
切片:取多个元素 包括左边不包括右边,(顾头不顾尾)
>>> names = ["Kkk","Tenglan","Eric","Rain","Tom","Amy"]
>>> names[1:4] #取下标1至下标4之间的数字,包括1,不包括4
['Tenglan', 'Eric', 'Rain']
>>> names[1:-1] #取下标1至-1的值,不包括-1
['Tenglan', 'Eric', 'Rain', 'Tom']
>>> names[0:3] #切片;
['Kkk', 'Tenglan', 'Eric']
>>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样
['Kkk', 'Tenglan', 'Eric']
>>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写
['Rain', 'Tom', 'Amy']
>>> names[3:-1] #这样-1就不会被包含了
['Rain', 'Tom']
>>> names[0::2] #后面的2是代表步长,每隔一个元素,就取一个
['Kkk', 'Eric', 'Tom']
>>> names[::2] #和上句效果一样
['Kkk', 'Eric', 'Tom']
追加
>>> names
['Kkk', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy']
>>> names.append("我是新来的")
>>> names
['Kkk', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
插入
>>> names
['Kkk', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names.insert(2,"强行从Eric前面插入")
>>> names
['Kkk', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names.insert(5,"从eric后面插入试试新姿势")
>>> names
['Kkk', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
修改
>>> names
['Kkk', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
>>> names[2] = "该换人了"
>>> names
['Kkk', 'Tenglan', '该换人了', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
删除
>>> del names[2]
>>> names
['Kkk', 'Tenglan', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
>>> del names[4]
>>> names
['Kkk', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>>
del names #删除整个列表
>>> names.remove("Eric") #删除指定元素
>>> names
['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names.pop() #默认删除列表最后一个值,也可输入下标,删除指定位置的元素
'我是新来的'
>>> names
['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy']
扩展
>>> names
['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy']
>>> b = [1,2,3]
>>> names.extend(b)
>>> names
['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
拷贝
>>> names
['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
>>> name_copy = names.copy()
>>> name_copy
['Kkk', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
eg.坑
names = ["1zhangsan","lisi","#wangwu",["kkk","yyy"],"danzong"]
name2 = names.copy()
print(names)
print(name2)
names[2] = "旦总"
names[3][0] = '李四'
print(names)
print(name2)
=================结果=============
['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']
['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']
['1zhangsan', 'lisi', '旦总', ['李四', 'yyy'], 'danzong']
['1zhangsan', 'lisi', '#wangwu', ['李四', 'yyy'], 'danzong']
结论:列表的copy()为浅copy;它只会copy第一层的内容(独立克隆一份),超过一层的它会把内存地址拷贝过来;所以第二层会指向原来列表的第二层内容。
浅copy第二个列表只是第一个列表的引用而已。
eg.实例
import copy
person = ['name',['saving',100]] #例如联合账号,数组内为银行存款
'''
p1=copy.copy(person)
p2=person[:]
p3=person.copy()
p4=list(person)
'''
#浅copy
p1=person[:]
p2=person[:]
p1[0]='kkk'
p2[0]='fengjie'
p1[1][1]=50
print(p1)
print(p2)
===========结果======
['kkk', ['saving', 50]]
['fengjie', ['saving', 50]]
列表等于:
names = ["1zhangsan","lisi","#wangwu",["kkk","yyy"],"danzong"]
name2 = names
print(names)
print(name2)
names[2] = "旦总"
names[3][0] = '李四'
print(names)
print(name2)
==============结果====================
['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']
['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']
['1zhangsan', 'lisi', '旦总', ['李四', 'yyy'], 'danzong']
['1zhangsan', 'lisi', '旦总', ['李四', 'yyy'], 'danzong']
列表的赋值相等,两个列表的内存相等,都指向同一块内存区域。
深COPY:(不常用,耗费内存空间)
import copy
names = ["1zhangsan","lisi","#wangwu",["kkk","yyy"],"danzong"]
#name2 = copy.copy(names) #浅copy,等同于
names2=names.copy()
name2 = copy.deepcopy(names) #深copy,完全copy,不管第几层。
print(names)
print(name2)
names[2] = "旦总"
names[3][0] = '李四'
print(names)
print(name2)
===========结果===========
['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']
['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']
['1zhangsan', 'lisi', '旦总', ['李四', 'yyy'], 'danzong']
['1zhangsan', 'lisi', '#wangwu', ['kkk', 'yyy'], 'danzong']
统计
>>> names
['Kkk', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
>>> names.count("Amy")
2
排序&翻转
>>> names
['Kkk', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
>>> names.sort() #排序(根据ASCII码进行排序)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str() #3.0里不同数据类型不能放在一起排序了,擦
>>> names[-3] = '1'
>>> names[-2] = '2'
>>> names[-1] = '3'
>>> names
['Kkk', 'Amy', 'Amy', 'Tenglan', 'Tom', '1', '2', '3']
>>> names.sort()
>>> names
['1', '2', '3', 'Kkk', 'Amy', 'Amy', 'Tenglan', 'Tom']
>>> names.reverse() #反转
>>> names
['Tom', 'Tenglan', 'Amy', 'Amy', 'Kkk', '3', '2', '1']
获取下标
>>> names
['Tom', 'Tenglan', 'Amy', 'Amy', 'Kkk', '3', '2', '1']
>>> names.index("Amy")
2 #只返回找到的第一个下标
列表for循环
names = ["1zhangsan","lisi","#wangwu",["kkk","yyy"],"danzong"]
for i in names:
print(i)
==========结果==============
1zhangsan
lisi
#wangwu
['kkk', 'yyy']
danzong
元组
元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表
语法
|
1 |
names = ("Kkk","jack","eric") |
它只有2个方法,一个是count,一个是index,完毕。
程序练习
请写出以下程序。
程序:购物车程序
需求:
- 启动程序后,让用户输入工资,然后打印商品列表
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
思路(流程图):

code:
good_list=[
("故事汇",20),("钢笔",15),("华为手机",3000),("笔记本电脑",6000),("64GB
U盘",100)
] #产品列表
shopping_list=[] #购物列表
salary = input("Please input your salary:") #工资
if salary.isdigit():
#判断是否输入数字
salary =
int(salary)
while salary>0:
#方法1:
# for item in good_list:
#
print(good_list.index(item),item) #通过下标来找
#方法2:
for index,item in enumerate(good_list):#使用枚举函数获取index、item
print(index,item)
#\033[32; str \033[0m 绿色字体显示 ;\033[31; str \033[0m 红色字体显示
#\033[42; str \033[0m 绿色底色 ;\033[41; str \033[0m 红色底色
user_choice =
input("\033[32;1m请输入序号进行购买。您可以随时按'Q'或'q'键退出。\033[0m")#用户选择
if user_choice == 'Q'or user_choice == 'q':#退出
if len(shopping_list) == 0:#啥都没买
print("\033[32;1m欢迎再次光临,您并未购买任何商品。\033[0m")
else:#买了东西
print("\033[32;1m欢迎再次光临。您购买的商品如下:\033[0m")
for i in shopping_list:
print(i)
print("您的余额为:\033[31;1m %s\033[0m" %(salary))
exit()
elif user_choice.isdigit():
user_choice =
int(user_choice)
if user_choice <
len(good_list) and user_choice >= 0 :
if salary >=
good_list[user_choice][1]:
shopping_list.append(good_list[user_choice])
salary -=
good_list[user_choice][1]
print("
\033[32;1m %s\033[0m 购买成功。目前可用余额为:\033[31;1m%s\033[0m" %(good_list[user_choice][0],salary))
else:
print("\033[41;1m
对不起,您的余额不足,请挑选其他商品,按Q/q键退出.\033[0m")
else:
print("\033[31;1m
product code [%s] is not exist,Please try again later!\033[0m " %
user_choice)
else:
print("\033[31;1m
invalid option,Please try again!\033[0m")
else:
print("\033[31;1m您的余额已经为零,请下次光临。您购买的商品如下:\033[0m")
for i in shopping_list:
print(i)
if len(shopping_list) ==
0:
print("\033[31;1m您并未购买任何商品。\033[0m")
else:
print("\033[31;1m Sorry,your
input is not a number,Please try again!\033[0m")
2. 字符串操作
特性:不可修改
常用操作
name=“Kkk Li”
name.capitalize() 首字母大写
name.casefold() 大写全部变小写
name.center(50,"-") 输出 '---------------------Kkk Li----------------------' #一共打五十个字符不够的用”-”补全
name.count('lex') 统计 lex出现次数
name.encode() 将字符串编码成bytes格式
name.endswith("Li") 判断字符串是否以 Li结尾
"Kkk\tLi".expandtabs(10) 输出'Kkk Li', 将\t转换成10个的空格
name.find('A') 查找A,找到返回其索引, 找不到返回-1
format :
>>> msg = "my name is {}, and age is {}"
>>> msg.format("Kkk",22)
'my name is Kkk, and age is 22'
>>> msg = "my name is {1}, and age is {0}"
>>> msg.format("Kkk",22)
'my name is 22, and age is Kkk'
>>> msg = "my name is {name}, and age is {age}"
>>> msg.format(age=22,name="ale")
'my name is ale, and age is 22'
format_map
>>> msg.format_map({'name':'Kkk','age':22})
'my name is Kkk, and age is 22'
msg.index('a') 返回a所在字符串的索引
'9aA'.isalnum() True
'9'.isdigit() 是否整数
"|".join(['Kkk','jack','rain'])
'Kkk|jack|rain'
maketrans #建立对应关系
>>> intab = "aeiou" #This is the string having actual characters.
>>> outtab = "12345" #This is the string having corresponding mapping character
>>> trantab = str.maketrans(intab, outtab)
>>>
>>> str = "this is string example....wow!!!"
>>> str.translate(trantab)
'th3s 3s str3ng 2x1mpl2....w4w!!!'
msg.partition('is') 输出 ('my name ', 'is', ' {name}, and age is {age}')
>>> "Kkk li, chinese name is lijie".replace("li","LI",1)
'Kkk LI, chinese name is lijie'
msg.swapcase 大小写互换
>>> msg.zfill(40)
'00000my name is {name}, and age is {age}'
>>> n4.ljust(40,"-")
'Hello 2orld-----------------------------'
>>> n4.rjust(40,"-")
'-----------------------------Hello 2orld'
>>> b="ddefdsdff_哈哈"
>>> b.isidentifier() #检测一段字符串可否被当作标志符,即是否符合变量命名规则
True
最全示意:
name = "My \tname is {name} and iam {years} old."
print(name.capitalize()) #首字母大写
print(name.count('x')) #统计
print(name.center(50,"-")) #一共输出50个字符,name居中,剩下的用-填充完毕,
print(name.encode()) #编码
print(name.endswith('ing')) #判断是否以ing结尾,常用作邮箱判定是否以.com结尾
print(name.expandtabs(tabsize=30))
print(name.index('a')) #匹配第一个a
print(name[name.find("name"):9]) #切片
print(name.format(name='kkk',years=13))
print(name.format_map({'name':'kkk','years':13})) #字典的格式
print(name.isalnum()) #是否阿拉伯数字,只包含abc...xyz0123456789
print('abc123'.isalnum())
print(name.isalpha()) #是否为纯英文字符(大小写都可以)
print('0x1'.isdecimal()) #判断是否为一个十进制数
print('1a'.isdigit()) #判断是否为一个整数
print('_1a'.isidentifier()) #判断是否为一个合法的标识符(变量名)
print('a 1A'.islower()) #是否为小写
print('111.22'.isnumeric()) #是否为纯数字 等同于isdigit()
print(' '.isspace()) #是不是个空格
print('My Name Is '.istitle()) #是不是每个词首字母大写
print('sdf'.isprintable()) #是否能被打印,若是类似tty文件或drive 文件 不能被打印
name2=['kkk','ysuking',19]
name3=['i','donnot','know']
print(' '.join(name3)) #前面是间隔符,拼接
print('+'.join(str(i) for i in name2)) #如果非str需要转换成str在执行
print(name.ljust(50,'*')) #一共输出50个字符,name居左left,剩下的用*填充完毕,
print(name.rjust(50,'*')) #一共输出50个字符,name居右right,剩下的用*填充完毕,
print('KKK'.lower()) #把大写变成小写
print('kkk'.upper()) #把小写变成大写
print('\nkkk'.lstrip()) #把左边的空格或回车去掉
print('kkk\n'.rstrip()) #把右边的空格或回车去掉
print(' \n kkk \n'.strip()) #把所有的空格和回车都去掉
print('-----')
p = str.maketrans("kbcdef","123456") #建立对应关系
print('ysuking kkk'.translate(p)) #把前面的str按照p的对应关系进行替换
p = str.maketrans("abcdefg","!@#$%^&") #建立对应关系
print('I have A appletree '.translate(p)) #把前面的str按照p的对应关系进行替换
print('ysuking kkk '.replace('k','K',2)) #把什么替换成什么,换几个
print('ysuking kkk '.rfind('k')) #找左右边的'k'
print('ysuking kkk '.split()) #把字符串按照(默认)空格分成列表
print('ysuking kkk '.split('k')) #把字符串按照'k'分成列表
print('1+2\n+3+44'.splitlines()) #把字符串按照换行符分成列表
print('1+2\n+3+44'.startswith("1")) #是否是以1开头的
print('Ysu King'.swapcase()) #大小写互换
print('ysu king'.title()) #按照首字母大写处理各词
print('ysu king'.zfill(50)) #把不够的位数自动用0 填充
3. 字典操作
字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。
语法:
info = {
'stu1101': "TengLan Wu",
'stu1102': "LongZe Luola",
'stu1103': "XiaoZe Maliya",
}
字典的特性:
- dict是无序的
- key必须是唯一的,so 天生去重
增加
>>> info["stu1104"] = "苍井空"
>>> info
{'stu1102': 'LongZe Luola', 'stu1104': '苍井空', 'stu1103': 'XiaoZe Maliya', 'stu1101': 'TengLan Wu'}
修改
>>> info['stu1101'] = "武藤兰"
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1101': '武藤兰'}
删除
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1101': '武藤兰'}
>>> info.pop("stu1101") #标准删除姿势
'武藤兰'
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
>>> del info['stu1103'] #换个姿势删除
>>> info
{'stu1102': 'LongZe Luola'}
>>>
>>>
>>>
>>> info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'} #删除最靠后的那个
>>> info.popitem()
{'stu1103': 'XiaoZe Maliya'}
>>> info
('stu1102', 'LongZe Luola')
查找
>>> info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
>>>
>>> "stu1102" in info #标准用法
True
>>> info.get("stu1102") #获取
'LongZe Luola'
>>> info["stu1102"] #同上,但是看下面
'LongZe Luola'
>>> info["stu1105"] #如果一个key不存在,就报错,get不会,不存在只返回None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'stu1105'
多级字典嵌套及操作
av_catalog = {
"欧美":{
"www.youporn.com": ["很多免费的,世界最大的","质量一般"],
"www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
"letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
"x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
},
"日韩":{
"tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
},
"大陆":{
"1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
}
}
av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
print(av_catalog["大陆"]["1024"])
#ouput
['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']
其它姿势
#values
>>> info.values() #显示所有的value
dict_values(['LongZe Luola', 'XiaoZe Maliya'])
#keys
>>> info.keys() #显示所有的key
dict_keys(['stu1102', 'stu1103'])
#setdefault
>>> info.setdefault("stu1106","Kkk") #去info中取key为“stu1106”,如果有这个key,返回对应的value;如果没有这个key,创建这个key,value就是‘Kkk’。
'Kkk'
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Kkk'}
>>> info.setdefault("stu1102","龙泽萝拉")
'LongZe Luola'
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Kkk'}
#update
>>> info
{'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Kkk'}
>>> b = {1:2,3:4, "stu1102":"龙泽萝拉"}
>>> info.update(b)
>>> info
{'stu1102': '龙泽萝拉', 1: 2, 3: 4, 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Kkk'}
#items #把一个字典变成一个列表
info.items()
dict_items([('stu1102', '龙泽萝拉'), (1, 2), (3, 4), ('stu1103', 'XiaoZe Maliya'), ('stu1106', 'Kkk')])
#通过一个列表生成默认dict,有个没办法解释的坑,少用吧这个
>>> dict.fromkeys([1,2,3],'testd')
{1: 'testd', 2: 'testd', 3: 'testd'}
当遇到多层value时,所有的values共用同一片内存区域
循环dict
#方法1
for key in info: #打印key和value 更加高效,推荐使用
print(key,info[key])
#方法2
for k,v in info.items(): #会先把dict转成list,数据里大时莫用
print(k,v)
程序练习
程序: 三级菜单
要求:
- 打印省、市、县三级菜单
- 可返回上一级
- 可随时退出程序
menu = {
'北京':{
'海淀':{
'五道口':{
'soho':{},
'网易':{},
'google':{}
},
'中关村':{
'爱奇艺':{},
'汽车之家':{},
'youku':{},
},
'上地':{
'百度':{},
},
},
'昌平':{
'沙河':{
'老男孩':{},
'北航':{},
},
'天通苑':{},
'回龙观':{},
},
'朝阳':{},
'东城':{},
},
'上海':{
'闵行':{
"人民广场":{
'炸鸡店':{}
}
},
'闸北':{
'火车战':{
'携程':{}
}
},
'浦东':{},
},
'山东':{},
}
exit_flag = False
current_layer = menu
layers = [menu]
while not exit_flag:
for k in current_layer:
print(k)
choice = input(">>:").strip()
if choice == "b":
current_layer = layers[-1]
#print("change to laster", current_layer)
layers.pop()
elif choice not in current_layer:continue
else:
layers.append(current_layer)
current_layer = current_layer[choice]
pass 占位符/什么都不操作
浙公网安备 33010602011771号