python(⼆)——list、字典、字符串操作
列表——list
假设⼀种场景,想要存班⾥所有同学的名字,那应该拿什么存呢?
我们可以拿⼀个字符串去存,例如:
stus = "s1,s2,s3,s4,s5……sn"
那我们要从⾥⾯把某⼀个学⽣取出来,或者说,想要统计班级内有多少学⽣,这种⽅式可以是可以,但是未免太⿇烦,假设被别⼈看见你这么写,就可以卷铺盖回家了;为了⾥⾯我们被卷铺盖回家,我们可以怎么做?
答案是⽤: list(列表)
⽐如说:
stus = ['s1','s2','s3','s4',……,'sn',]
定义⼀个数组很简单,中括号内,每⼀个元素⽤逗号隔开,⾥⾯元素的类型不⼀定要⼀致,可以为 int ,
也可以为 str 类型,下标从 0 开始。
定义⼀个空列表,有两种⽅式:
stus = []
stus = list()
那么我们这⼀个 list ,怎么对它进⾏操作,也就是增删改查呢?
  append、insert
stus.append('鲁班')    #在 list 的末尾增加⼀个元素
stus.insert(9,'程咬⾦')    #在指定的位置插⼊元素
stus.insert(999,'后羿')    #在指定的位置插⼊元素,假设位置不存在,那么默认把元素插⼊到最后
  list 都是从下标开始取值
print('单个取',stus[0])    # 第⼀个元素
print('最后⼀个元素',stus[-1])    # 最后⼀个元素
print('倒数第⼆个元素',stus[-2])    # 倒数第⼆个元素
print('改之前的',stus)    # 整个列表
  到 list 的元素下标重新赋值
stus[4] = '马可波罗'  # 将下标为 4 的元素改成马可波罗
  但是,这⾥注意不要瞎赋值,假设赋值的下标超过最⼤值报错: IndexError: list assignment index out of range
  pop、del、remove
stus.pop(0)    # 删除指定位置的元素
stus.pop()    # 默认删除list⾥⾯最后⼀个元素
del stus[0]    # 删除指定的位置的元素
del stus    # 如果不跟下标,那么整个 list 会被删除
  那么有个特殊情况,假设我们删除的下标不存在,或者说要移除的元素不存在,是会报错:ValueError: ve(x): x not in list;IndexError: pop index out of range
其他常⽤⽅法
  我们根据场景来看⼀些⽅法
1、假设我们要判断⼀个 list 内某元素存不存在,或者说 list 内某元素的个数,⽤什么⽅法?
count = unt('程咬⾦')    # 某个元素在list⾥⾯的数量
2、把⼀个已经存在的 list 清空
stus.clear()    # 清空 list
3、将⼀个 list 重新复制⼀份
new_stus = py()    # 复制⼀个stus 列表,存为 new_stus
4、将 list 反转,第⼀个为最后⼀个,第⼆个为倒数第⼆个
print(stus)
5、将 list 排序
nums = [9,23,12,234,23,5235,235,235,23523,523]
nums.sort()    # 从⼩到⼤升序排列
nums.sort(reverse=True) # ⾥⾯加个反转,也就是从⼤到⼩排列
print(nums)
6、将两个 list 拼接,有两个⽅式
print(stus)
list3 = list1 + list2    # 将 list 1 和 list 2 拼接
7、要出⼀个元素在 list 的下标,要注意,这⾥只是显⽰在 list 内的第⼀个下标,⽽且元素不存在是会报错的:ValueError: '程咬⾦' is not in list
result = stus.index('程咬⾦')    # 某个元素的下标
8、判断⼀个元素是否在 list 内
if username not in usernames:
print('username 不在 list ⾥⾯')
if username  in usernames:
print('username 在 list ⾥⾯')
9、切⽚,假设有⼀个 list ,我们不同的步长打印出的结果也不⼀致,具体⽅式为:[::num](num 为所要打印的步长,为负数就逆向打印)
>>> shoplist = ['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::1]
['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::2]
['apple', 'carrot']
python中的字符串是什么>>> shoplist[::3]
['apple', 'banana']
>>> shoplist[::-1]
['banana', 'carrot', 'mango', 'apple']
10、如何知道⼀个 list 的长度呢?
nums = [1,2,3,4,5]
len(nums)
11、切⽚
切⽚的作⽤就是按⼀定的规则从 list 内取出元素,⽐如说我们要取出⼀个 list 的后⾯ 3 个元素,因为取下标只能⼀个⼀个取,如果我们想⼀次性取出来做⼀个 list ,有简单的⽅式就是切⽚
需要注意的是,切⽚顾头不顾尾,⽽且不只是 list ,有下标的都能切,⽐如说字符串
l = [1,2,3,4,5,6]
print(l[1:])    #从下标1-最后⼀位
print(l[:])    #取整个 list
print(l[1:4])    #下标1-3位
print(l[::-1])    # 反向打印,如果步长为负数,那么取值的时候从右往左
⼩结:
⽅法名功能
增 append在末尾增加元素
insert(1,'xxx')在下标为 1 前插⼊ xxx
查 stus[0] list[下标]
改 stus[4] = '马可波罗' list[下标] =  新值
删 pop(1)删除下标为 1 的,不传值删除最后⼀位 del stus[0]删除下标为 0 的元素
remove('xxx')删除 list 内的 xxx
常⽤⽅法 count('xxx')查询 xxx 在 list 内的数量
clear()清空 list
copy()将 list 复制出来
reverse()将 list 反转
sort()将 list 排序
extend() list 拼接
index('xxx') xxx 元素的的下标
in/not in判断某元素是否在 list 内,返回布尔值 [::num]切⽚
len(stus)返回 list 的长度
多维数组
判断⼏个维度,看有⼏个中括号就 ok 了
nums1 = [1,2,3,4,5,['a','b','c','d']]    # 2 维数组
nums2 = [1,2,3,4,['a','b','c','d',['test','dev','pre']]] # 3 维数组
其实,我们的多维数组,也就是将⼦ list 看成是上⼀级 list 的⼀个元素⽽已
那假设我们要取 nums1 ⾥⾯的 ‘c’,如何取?
print(nums1[5][2])
有趣的是,其实⼀个字符串也可以当成是⼀个 list 来看,⽐如说我们要取,nums2 list ⾥⾯的 dev 中的 'e' ,怎么取?print(nums2[4][4][1][1])
练习
⼀、
1. ⽤ list 存账号和密码
2. 需要校验⽤户不存在的话要提⽰
3. 需要校验是否为空
4. 账号密码正确登录成功,提⽰当前⽇期
5. 最多输错3次
解决⽅案:
1. 输⼊账号密码
2. 校验是否输⼊为空
3. 校验账号是否存在 unt()
4. 从usernames⾥⾯到user的下标,然后去password种去对应的密码
usernames = ['cwl','pn','gxn','hyp']
passwords = ['123456','abc123','324234','23423']
import datetime
today = day()
count = 0
# for i in range(4):
while count<3:
count+=1
username = input('username:').strip()#去掉⼀个字符串两边的空格
password = input('password:').strip()
if username==''or password=='':
print('账号/密码不能空!')
# unt(username)==0: #判断元素的个数
elif username not in usernames: #判断元素是否存在某个list⾥⾯
print('⽤户不存在!')
else:
user_index = usernames.index(username)#登录⽤户的下标
p = passwords[user_index]#根据下标取到密码
if password == p:#判断密码是否正确
print('欢迎%s登录,今天的⽇期是%s.'%(username,today))
break
else:
print('密码错误!')
else:
print('错误次数已经⽤尽')
注意:最后⾯的 else 是对应 for 循环的,当 for 循环正常全部执⾏完,那么就会去执⾏ else,可以发现我们的 for 循环内加了⼀个 break ,假设 for 循环被 break 住了,就不会去
执⾏ else内的内容。这⾥再提⼀句 break 和 continue 的区别:
break 语句⽤于中断循环语句,也就是中⽌循环语句的执⾏,要注意的是:中断了 for 循环/while 循环,相应循环的 else 模块将不被执⾏
continue 语句是告诉 Python 跳过当前循环块中剩余的语句,并继续该循环的下⼀次迭代
⼆、写⼀个 sql 插⼊的语句,要求在 user 的 list 每个⽤户名字前⾯加上字母标志:bt-
复杂的⽅式1:取下标循环
stus = ['chengweiliang','chenqi','guoliwen']
password='123456'
index = 0
username=''
while index<len(stus):
username = stus[index]
username = 'szz-'+username
sql='insert into user (username,password) value ("%s","%s");'%(username,password)
print(sql)
index+=1
复杂的⽅式2:
for i in range(len(stus)):  #b
username = stus[i]
print(username)
sql='insert into user (username,password) value ("%s","%s");'%(username,password)
简单的⽅式(推荐):直接循环。for 循环直接循环⼀个 list ,就是取 list ⾥⾯的每⼀个元素
stus = ['chengweiliang','chenqi','guoliwen']
password = '123456'
for stu in stus:    # for循环直接循环⼀个 list,就是取 list ⾥⾯的每⼀个元素,这⾥的 stu 是随意命名的,直接⽤ i 也成,这个只是为了增强可读性
print('每次循环取的值',stu)
username = 'bt-'+stu
print(username)
sql='insert into user (username,password) value ("%s","%s");'%(username,password)
列表⽣成式
假设我们要有⼀个 list ,要将其变成⼀个两位的数数组(⼀位的前⾯补零),那么按照我们传统的⽅式来做就是:
l = []
for i in range(1,11)
l.append(str(i).zfill(2))
那么有没有⾼级的做法?有的,叫列表⽣成式:
l2 = [str(i).zfill(2) for i in range(1,11)]
字典——dict
假设我们要存⼀个班级内学⽣的信息:⽤户名,密码,电话,住址……
那如果还⽤ list 来存,最好的⽅式就是做⼀个⼆维数组:
stus = [
['鲁班','123','1112','sdfsdf',[1,2,3,4] ],
['后裔','123','1112','sdfsdf',200,'北京'],
['程咬⾦','123','1112','sdfsdf',100],
['狄仁杰','123','1112','sdfsdf',200],
]
但这样看起来并不直观,⽽且取数很⿇烦,那么更好的⽅式是什么呢?
字典的⽅式:以⼀种 key-value 键值对⽅式来存
字典是⼀种key-value的数据类型,⽐如说要存每个⼈的信息,那么每个⼈的编号就是key,value就是每个⼈的信息,这样的话,⼀个字典就能存所有⼈的信息了。字典的定义
使⽤{},⼤括号,每个值⽤“,”隔开,key和value使⽤“:”分隔
stu_info = {
'username':'gzw',
'password':'123456',
'money':20,
'addr':'⼴州'
}
为什么dict查速度这么快?因为dict的实现原理和查字典是⼀样的。假设字典包含了1万个汉字,我们要查某⼀个字,⼀个办法是把字典从第⼀页往后翻,直到到我们想要的
字为⽌,这种⽅法就是在list中查元素的⽅法,list越⼤,查越慢。
第⼆种⽅法是先在字典的索引表⾥(⽐如部⾸表)查这个字对应的页码,然后直接翻到该页,到这个字。⽆论哪个字,这种查速度都⾮常快,不会随着字典⼤⼩的增加⽽
变慢,这种就是字典的实现⽅式。
字典的特性:
字典是⽆序的,因为它没有下标,⽤key来当索引,所以是⽆序的
字典的key必须是唯⼀的,因为它是通过key来进⾏索引的,所以key不能重复,天⽣就去重
那么我们来介绍⼀些字典的常⽤操作
新增字典
d1 = {} #创建空字典
d2 = dict() #创建空字典
d1['name'] = '后裔'
d1['age'] =  18
d1.setdefault('class','双⼦座')  # 这个增加的 key 是增加默认 key 值。如果使⽤ setdefault,key已经存在了,就不会修改原来key的值,setdefault 相当于⼀个初始化操作,不具备修改功能。如果这个key存在的话,那就不动它,不存在的话,添加print('之前的',d1)
d2 = {'abc':1234}
d1.update(d2)    # 在 d1 字典内增加⼀个 d2 字典,更新字典值,如果key存在的话,就更新,不存在的话就添加
print(d1)
只有⼀种⽅式
d1['name']='甄姬'
print(d1['name'])  # 当 key 不存在时,会报错:KeyError
('money'))  # 当 key 不存在时,不会报错,返回⼀个 None
('money',0))    # 当 key 不存在,返回默认值为 0
print(d1.keys())    # 取到字典⾥⾯所有的key,存为⼀个 list
print(d1.values())    # 取到字典⾥⾯所有的value,存为⼀个 list
d1.pop('name')  # 删除 key 为 name
del d1['name']  # 删除 key 为 name
d1.popitem()    # 随机删除⼀个 key
d1.clear()    # 清空整个字典
其他常⽤⽅法
1、打印所有的 key/value
print(d1.keys())    # 取到字典⾥⾯所有的key,存为⼀个 list
print(d1.values())    # 取到字典⾥⾯所有的value,存为⼀个 list
2、如果这个key存在的话,那就不动它,不存在的话,添加⼀个
d1.setdefault('class','双⼦座')
3、更新字典值,假设 key 存在,则直接更新 value,不存在 key ,则新增该 key-value
d2 = {'abc':1234}
d1.update(d2)    # 在 d1 字典内增加⼀个 d2 字典,更新字典值,如果key存在的话,就更新,不存在的话就添加4、将字典转化成⼀个 list
print(dic.items())    # 字典转换成⼀个list
5、循环字典
dic = {'stu1':'cc','stu2':'andashu','stu3':'niuniu'}
for k in dic:
print(k,dic[k])    # 打印key和value的值,推荐使⽤这种⽅式,速度快
for k,v in dic.items():
print(k,v)    # 打印key和value的值,这种⽅式不推荐,因为会把字典转换成列表,效率不⾼
⼩结:
⽅法功能
新增字典d1 = {}新增空字典d2 = dict()新增空字典
增d1.['key'] = 'value'新增⼀对 key-value
改d1.['key'] = 'new_value'将 key 的值改为 new_value
查d1['key']查 key 值对应的 value,key 值不存在会报错d1.get['key']当 key 不存在时,返回 None
删d1.pop('key')删除 key
del d1['key']删除 key
d1.popitem()随机删除⼀个 key d1.clear()清空整个字典
其他⽅法print(d1.keys())以⼀个 list 形式打印所有 key 值print(d1.values())以⼀个 list 形式打印所有 value 值
d1.setdefault('key','value')如果 key 存在就不变,不存在就增加d1.update(d2)如果 key 存在就更新,不存在就增加d1.items()把字典转化成⼀个 list
for i in d1:print(i,dic[i])循环取值,其实就是取到 key
if key in d1:print(key 存在)判断 key 是否存在
练习
⼀、
我们有⼀个 list ,⾥⾯存的是字典,现要求:
1. 统计⼀下现有学⽣总共有多少⾦币
2. 出⾦币⼩于100的学⽣姓名
3. ⾦币⼤于500的学⽣,扣去300⾦币,⼩于等于100的⼈,加上200⾦币users = [
{
"id": 2,
"name": "矿泉⽔",
"sex": "未知",
"age": 38,
"addr": "天通苑123",
"grade": "双⼦座123",
"phone": "12123654311",
"gold": 34000
},
{
"id": 8292,
"name": "矿泉⽔",
"sex": "未知",
"age": 38,
"addr": "天通苑",
"grade": "双⼦座",
"phone": "12123676705",
"gold": 100
},
{
"id": 8308,
"name": "矿泉⽔",
"sex": "未知",
"age": 38,
"addr": "天通苑",
"grade": "双⼦座",
"phone": "12123610039",
"gold": 100
},
{
"id": 8309,
"name": "矿泉⽔",
"sex": "未知",
"age": 38,
"addr": "天通苑",
"grade": "双⼦座",
"phone": "12123675980",
"gold": 100
},
{
"id": 8310,
"name": "矿泉⽔",
"sex": "未知",
"age": 38,
"addr": "天通苑",
"grade": "双⼦座",
"phone": "12123629672",
"gold": 100
},
{
"id": 8311,
"name": "矿泉⽔",
"sex": "未知",
"age": 38,
"addr": "天通苑",
"grade": "双⼦座",
"phone": "12123689607",
"gold": 100
},
{
"id": 8312,
"name": "矿泉⽔",
"sex": "未知",
"age": 38,
"addr": "天通苑",
"grade": "双⼦座",
"phone": "12123638612",
"gold": 100
},
{
"id": 8313,
"name": "矿泉⽔",
"sex": "未知",
"age": 38,
"addr": "天通苑",
"grade": "双⼦座",
"phone": "12123628322",
"gold": 100
},
{
"id": 8314,
"name": "矿泉⽔",
"sex": "未知",
"age": 38,
"addr": "天通苑",
"grade": "双⼦座",
"phone": "12123663283",
"gold": 100
},
{
"id": 8315,
"name": "矿泉⽔",
"sex": "未知",
"age": 38,
"addr": "天通苑",
"grade": "双⼦座",
"phone": "12123634676",
"gold": 100
},
{
"id": 8316,
"name": "矿泉⽔",
"sex": "未知",
"age": 38,
"addr": "天通苑",
"grade": "双⼦座",
"phone": "12123680540",
"gold": 100
},
{
"id": 9909,
"name": "矿泉⽔",
"sex": "男",
"age": 15,
"addr": "中国湖南",
"grade": "双⼦座",
"phone": "12345679999",
"gold": 100
},
{
"id": 10277,
"name": "矿泉⽔",
"sex": "男",
"age": 18,
"addr": "北京市昌平区",
"grade": "双⼦座",
"phone": "152********",
"gold": 100
}
]
user
解决⽅案:
1、统计⼀下现有学⽣总共有多少⾦币
1. 循环users这个list
2. 从每个user的字典⾥⾯取到gold
3. 把每次的gold值相加
2、出⾦币⼩于100的学⽣姓名
1. 循环users这个list
2. 从每个user的字典⾥⾯取到gold
3. 判断gold的值是否⼩于100
3、⾦币⼤于500的学⽣,扣去300⾦币,⼩于等于100的⼈,加上200⾦币
1. 循环users这个list
2. 从每个user的字典⾥⾯取到gold
all_gold = 0 #存放所有的⾦币

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。