第3课:列表和字典的增删改查、字符串常用方法、文件操作

1.  
1)列表的增删改查
stus = ['1','2','3']
#增
stus.insert(0,'茄茄')
stus.insert(9,"茄茄1")    #序号超出序列长度,默认加到最后
stus.insert(-1,"茄茄2")   #这里需注意,-1默认插到最后一个。
print(stus)
#删
stus.pop() #传参:下标;默认删除最后1个元素;若指定下标,则删除指定元素;若指定的下标不存在,报错。
stus.pop(1)
print(stus.pop())  #返回删除的值
stus.remove("1") #传参:元素;删除list中指定的元素,如果有多个删除第1个;无返回值。
del stus[0]  #删除指定下标的元素
stus.clear()  #清空lis
#改
stus[0] = 'qieqie'
print(stus)
#查看
print(stus)
print(stus[-1])
print(stus.count("茄茄")) #查找某个元素在列表中出现的次数,如果不存在,返回0
print(stus.index("茄茄")) #查找某个元素的下标,如果有多个元素,返回第一个元素下标;如果查找的元素不存在,运行时会报错
2)列表的其它方法
stus.reverse() #反转list
print(stus)
stus.sort()  #默认升序;字符串按ASCII码排,数字按大小排。
num = [9,31,345,367,299,789,100]
num.sort()  #排序有个前提:元素必须都是同类型的才能排序成功。
num.sort(reverse=True) #按降序排

 3)多维列表

all_nums = [123,456,[789,11,10]]
three = [123,456,[789,11,10,["hahaha",'1234']]]
print(three[-1][-1][0]) #取元素hahaha
all_nums.extend(three) #合并2个list,把three加在all_nums后面
print(all_nums)

  4)切片:list取值的一种方式,顾头不顾尾

 1 nums = [1,2,3,4,4,5,6,7,8]
 2 print(nums[::2])
 3 print(nums[:6])#如果切片前面一个值不写的话,从开头取
 4 print(nums[3:])##如果切片后面的值不写的话,取到末尾
 5 print(nums[:])#如果前面的值和后面的值都不写的话,全取过来
 6 
 7 print(nums[::-1]) #步长是负数,从右往左取;反之从左往右取
 8 #特殊情况
 9 print(nums[0:8:-1]) #这样取出来的是空,因为步长为负数,从右往左查找,找不到下标0和8
10 切片同样适用于字符串,字符串也有下标
11 title = "今天发苹果"
12 print(title[:4])
13 #对于1个list,既要取下标又要取元素值,就可以用enumerate
14 for i,v in enumerate(title):
15     print("%s:%s"%(i,v))

  5)综合练习题:

 1 #注册:username,passwd
 2 all_users = []
 3 while True:
 4     username = input("请输入用户名:")
 5     if username not in all_users:
 6     #if all_users.count(username) == 0:
 7         passwd = input("请输入密码:")
 8         all_users.append(username)
 9         print("注册成功")
10     else:
11         print("该用户名已注册")

 6)元组:是一种特殊的list,只能查,不能增删改

1 a = (1)
2 b = ('ssss')
3 c = (1,2,3,4)
4 print(c)
5 print(c[0:3])  #元组也能使用切片
6 mysql = ('127.0.0.1','3307','my','root','123456')
7 mysql.count('my') #计数
8 mysql.index('my') #返回元素下标

 7)非空/None即真;非0即真

 1 a = ''
 2 b = 11
 3 if a:
 4     print("")
 5 else:
 6     print("")
 7 if b:
 8     print("")
 9 else:
10     print("")

 2.  

 1)字典:取值方便,速度快

dict={
        'name':'qieqie',
        'age':'18',
        'sex':'',
        'addr':'昌平区',
        'money':'20K',
        'huazhuagnpin':{
            '神仙水':80000
        }
    }
    #dict[0]['jinku']['$']
    dict = {
        'name': 'qieqie',
        'age': '18',
        'sex': '',
        'addr': '昌平区',
        'money': '20K',
        "bag":{
            "lv":10
    }

    dict = {
        'name': 'qieqie',
        'age': '18',
        'sex': '',
        'addr': '昌平区',
        'money': '20K'
    }
    stus = {
        'ybq':{
            'name': 'qieqie',
            'age': '18',
            'sex': '',
            'addr': '昌平区',
            'money': '20K',
            "jinku":{
                '建行卡':80000,
                '工行卡':800000,
                '招行卡':8000000
            }
        }
    }
  #两种取和方式
    sumall = 0
    for i in stus['ybq']['jinku'].values():
        sumall+=i
    print(sumall)
    print(sum(stus['ybq']['jinku'].values()))
  #易错点
    print(stus['ybq']['jinku'].values()[0]) #这种写法会报错TypeError: 'dict_values' object does not support indexing
    dict_values([80000, 800000, 8000000])  #这种直接用下标取值会报错,但是可以直接循环
    print(dict.get('namme1'))
  #
  d['shengao']=198  
   d.setdefault('weight',130)  #d.setdefault(key[,default])如果键值在字典中,返回该键对应的值;如果不在,返回default的值,默认为None

    #删除字段的值
    dict.pop('age') #删除指定的key和它的value
    print(dict)
    dict.popitem() #随机删除1个
    print(dict)
    del dict['age'] #删除字典指定key和它的value
    dict.clear() #清空字典
  #修改字典的值
    dict['age'] = 20 #如果此key存在,修改它的值,如果不存在,新增1个元素
    print(dict)
    #
    dict.keys() #获取字典中所有的keys
    dict.values() #获取字典中所有的values
    print(dict.items()) #把字典转成二维list数组,效率低
 # d.has_key('addr') #python2里面字典有这个方法,有没有这个key
    if 'addr' in d     :#判断key是否在这个字典里
         print('addr')

    #这种遍历方式效率较低
    for k,v in dict.items():
        print("k=%s,v=%s"%(k,v))
    #高效的遍历字段的方法:
    for k in dict:
        print(k,dict[k])

    print(dict.items())#直接打印看上去像个二维list数组,实际上不是的
    print(dict.items()[0])#这种写法会报错,需要先将其强制转换为list
    res = list(dict.items())
    print(res[0])

 2)综合练习题

#账号/密码/密码确认
#非空
#已经存在的不能注册
all_user = {}
while True:
    username = input("请输入用户名:").strip()
    passwd = input("请输入密码:").strip()
    spasswd = input("请再次输入密码:").strip()
    if username and passwd and spasswd:
        if username in all_user:
            print("用户名已存在")
        else:
            if passwd == spasswd:
                all_user[username]=passwd
                print("注册成功")
                break
            else:
                print("两次输入的密码不一致")
    else:
        print("用户名或密码或确认密码不能为空")
#登录程序:
      #1.非空
      #2.如果输入的用户名不存在,要提示
all_user = {'1':'1','2':'2'}
while True:
    name = input("请输入用户名:").strip()
    pwd = input("请输入密码:").strip()
    if name and pwd:
        if name not in all_user.keys():
            print("用户名不存在")
        else:
                if all_user[name] == pwd:
                    print("恭喜,登录成功")
                    break
                else:
                    print("用户名或密码有误")
    else:
        print("用户名或密码不能为空")

 3)小结和需注意的点:

#可变变量:list 字典
#不可变变量:一旦创建,不能修改的变量:元组,字符串
s = 'abcefg'
print(s[3])
s[3] = 'd' #这种写法有误

#运行结果为:1 2 4 6 8:循环list时尽量不要做删除操作
li = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9]
li = [1, 11, 3, 33, 4, 5, 6, 7, 8, 9]
for i in li:
    if i % 2 != 0:
        li.remove(i)
print(li)
#替代方法:
li = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#li2 = li[:] #深拷贝,内存地址会变
li2 = li #浅拷贝,内存地址不会变
print(id(li))
print(id(li2))
for i in li2:
    if i % 2 != 0:
        li.remove(i)
print(li)

3.  字符串常用的方法

#字符串的这些方法都不会改变原来字符串的值
name = '   besttest   ok1ok
'
print(name.strip()) #默认去掉首尾空格和换行符返回一个新的字符串
print(name)
new_name= name.strip('ok') #去掉ok
#new_name = name.lstrip()#默认去掉左边的空格和换行符
#new_name = name.rstrip()#默认去掉右边的空格和换行符
print(new_name)
new_name = name.count('t')#查找指定字符串在字符串中出现的次数
new_name.capitalize() #将字符串首字母大写
name.center(50,'*') # 在字符串左右各加50个*
index = name.find('d') #查找某个字符串,返回它的下标,未找到,返回-1
index = name.index('d') #查找某个字符串,返回它的下标,未找到,报错
name.upper()#把所有字母转化为大写
name.lower()#把所有字母转化为小写
file_name = 'a.xlsx'
print(file_name.endswith('.xlsx')) #判断一个字符串以***结尾的
sql = 'select,update,delete,insert,drop,create,'
print(sql.startswith('select'))
#格式化
f = '{name} 欢迎光临'
f.format(name = 'qieqie')
f1 = '{name}  欢迎 {age}'
d = {'name':'qieqie','age':19}
f1.format_map(d) #字符串格式化,传进去的是1个字典
#字符串替换
sql1 = 'select * from aa'
new_sql = sql1.replace('select','update')
print(new_sql)
print('aaa'.islower())#判断字符串是否全是小写字母
print('BBB'.isupper())#判断字符串是否全是大写字母
print('aB'.islower())
print('12'.isdigit()) #判断是否是数字
print('abc1'.isalpha()) #判断是否是英文字母
print('ab1'.isalnum())#判断字符串是否包括数字或字母

str = 'a,b,c,d,e,f'
str1 = 'a b c'
#print(list(str))
#字符串分割方法split()
print(str.split(',')) #返回1个list
print(str1.split()) #默认按空格分隔,多个空格同理
#字符串拼接方法join()
slit = ['a','b','c']
s1 = 'abcd'
s2 = ('1','2','3')
s3 = {'1':'1','2':'2','3':'3'}
#可迭代对象即:可循环对象
res = '*'.join(slit) #被拼接的对象中的元素必须是可迭代对象:可以是字符串,也可以是list,list中必须是字符串;也可以是字典(字典的key value必须是字符串)
res1 = '*'.join(s1)
res2 = '*'.join(s2)
res3 = '*'.join(s3)
print(res,res1,res2)
4.  文件操作
#Python3中没有file,只有open()
#文件打卡的3种方式:
#读:如果文件打开时未指定打开方式,默认为读
  #读写模式:r+ :只要有r,文件不存在时会报错,所以要保证文件的存在
#写:w模式会清空原有文件内容,若文件不存在,新建文件
  #写读模式:w+:
#追加  a  :若文件存在,则会追加到文件的末尾;若文件不存在,则新建文件。该模式不能使用read()
  #追加读写:a+:以读写模式打开,追加在文件末尾,可以用read()
f = open('C:\Users\Administrator\Desktop\测试.txt','a+')
f.seek(0) #将文件指针移至文件头;移动指针时,只对read好使,对写不好使。
# f.read() 返回的是字符串
# f.readline 读取一行的内容,返回的是字符串
print(f.read())  
f.write('nihaoma')
print(f.read())
f.seek(0)
print(f.read()) #打印出的无

print(f.readline())
print(f.readlines()) # 读取文件中所有的内容,把文件中每一行的内容存在1个list中,每个元素后有

# f.truncate()  # 清空文件内容
print(f.read())
print(f.tell()) # 查看文件指针当前的位置
names = ['a','b','c','d']
f.writelines(names) #参数是可迭代对象,list 字符串 字典
f.write(names) #运行会报错,参数必须是字符串
f = open('a.txt','w',encoding='utf-8')
names = ['a','b','c']
# s='dingfei,123456'
# f.write(s)
f.writelines(s)
# for name in names:
# f.write(name)
for name in names:
  f.writelines(names)
#f.close() #高效处理文件的方法 fw = open('C:\Users\Administrator\Desktop\测试.txt') for f in fw: #直接循环文件对象,就是循环文件中的每一行 print(f) #f此时为str类型,如果想去掉空格或换行符,或略过空行,用f.strip() ff=f.split(',') print(ff) #不要把打开文件放在循环中
原文地址:https://www.cnblogs.com/qiezizi/p/8116835.html