zoukankan      html  css  js  c++  java
  • python的list的基本操作、list循环、切片、字典基本操作、字典嵌套、字符串常用方法

    上面说了字符串和整形,那现在要是想存一个班级的人的名字,这个班有200个人,怎么存呢,用字符串的话,那就是names = 'marry lily king .....'这样,但是这样存是可以存,那要是想取到某个人的名字怎么取呢,不能再去里面看一遍吧,那累死人了,为了解决这个问题,又有一种新的数据类型应运而生,那就是列表,这也是我们在以后的开发过程中,最常用的数据类型之一,列表也叫数组,列表定义,使用[]

    #list的是一种新的数据类型,也可以叫数组:
    stus=['谢谢','谢1','谢2','谢3','谢4',19.3,89]
    #里面的每个元素可以叫下标、索引、角标
    print(stus[6])
    #定义一个空的数组:stus=[]或者stus = list()
    # 关于List的增、删、改、查
    # list 的增
    stus=['谢谢','谢1','谢2','谢3','谢4']
    stus.append('谢5')#append在list的末尾增加一个元素
    stus.append('谢6')
    stus.insert(0,'谢0')#insert在list的指定位置增加元素
    stus.insert(2,'谢哈')
    stus.insert(20,'谢20')#insert时,如果指定位置不存在时,直接在最后增加这个元素
    print(len(stus))#看list里面元素的个数有几个
    print(stus)
    # list的改,改只有下面一种方式
    stus=['谢谢','谢1','谢2','谢3','谢4']
    stus[0] = 'xiexie'
    print('改完之后的:',stus)
    #下标写负数时,是指从后面元素开始找,下标-1代表最后一个元素
    print(stus[-1])

    #list的删除
    stus=['谢谢','谢1','谢2','谢3','谢4']
    # 方法一:
    stus.pop()#用pop时,默认删除最后一个元素,同时也可以传一个下标来删除
    stus.pop(-1)
    # 方法二:
    stus.remove('谢谢')#只能删除指定的元素,不能不传
    #用pop传一个不存在的下标、用remove传一个不存在的元素:
    stus.pop(-10)#会报错:IndexError: pop index out of range(下标越界,下标不存在)
    stus.remove('哈哈')#会报错:ValueError: list.remove(x): x not in list(元素不存在列表中)
    del stus[-1] #删除指定的元素
    stus.clear()#清空列表
    print(stus)
    #list的查询
    stus=['谢谢','谢1','谢2','谢3','谢4']
    stus.insert(-1,'谢谢')
    stus.remove('谢3')
    print(stus)
    #根据下标来取值
    print(stus[-1])
    # 查询方法
    stus.count('谢谢')#查询某个元素在list里面出现的次数
    #删除一个不存在的元素:返回0
    stus.count('谢3')
    print(stus.count('谢3'))
    #找某个元素的下标index
    stus.index('谢1')
    print(stus.index('谢1'))
    #如果list里面有多个元素,返回的是第几个的下标:返回第一个元素的下标
    stus.index('谢谢')
    print(stus.index('谢谢'))
    #如果元素不存在时,返回的是什么:报错:ValueError: '谢10' is not in list(该元素不在这个列表里面)
    stus.index('谢10')
    print(stus.index('谢10'))
    列表操作,一些内置的方法
    stus.reverse()#反转
    nums = [1,5,3,4]
    nums.sort()#排序 中文无法排序,英文和数字可以(默认升序)
    nums.sort(reverse=True)#如果想要降序排列sort里面加reverse=True,升序False
    print(nums)
    # stus.extend()#把一个元素里面的List加到另外一个元素里面
    stus.extend(nums)#把nums里面的元素加到stus里面
    print(stus)
    #布尔类型
    #True Flase 我们在写判断的时候所有的表达式都会转换成布尔类型
    #
    stus=['谢谢','谢1','谢2','谢3','谢4']
    print(stus)
    #用count判断:
    if stus.count('哈哈')>0:
    print('存在')
    else:
    print('不存在')
    #用in判断
    if '谢谢' in stus:
    print('存在')
    else:
    print('不存在')
    list循环
    stus = ['杨静', '王志华', '王银梅', '乔美玲',
    '段鑫琪', '王立文', '赵燕',
    '杨华', '周永波', '杨静']
    # for s in stus:
    # print('用户名是:%s'%s)

    # for a in range(len(stus)):#rang下标
    # print(stus[a])

    # count = 0
    # while count<len(stus):
    # print(stus[count])
    # count+=1
    #导致第三方模块就值转成拼音:下载第三方模块安装xpinyin
    # p = xpinyin.Pinyin()
    # for s in stus:
    # stu_pinyin =p.get_pinyin(s,'')
    # print(stu_pinyin)

    #同时取下标和值的方法:enumerate同时取下标和值的函数
    #方法一:
    # for i in range(len(stus)):#同时取到下标和值
    # print('下标是:%s ,值是:%s'%(i,stus[i]))
    #方法二:用enumerate函数:
    for index,stu in enumerate(stus):
    print('%s ===> %s'%(index,stu))
    enumerate的一般用途:
    choice = ['注册','登录','退出','购物']
    s ='输入编号进入对应的操作:'
    print(s)
    for index,a in enumerate(choice):
    print('%s ===>%s'%(index,a))
    多维数组
    表里面可以再套列表,一个里面套一个列表,叫二维数组;一个里面套一个列表,里面的列表再套一个列表,这个叫三维数组,套几层就是几维,定义格式如下:

    stu =[1,2,3,4]#一维
    stu1 =[1,2,3,4,['a','b','c'],['d','e','f']]#二维
    #把d改成dd
    stu1[5][0] = 'dd'
    print(stu1)
    stu2 =[1,2,3,4,['a','b','c',['啊','啊1','啊2']]]#三维
    #在啊前面增加一个元素呵
    stu2[4][3].insert(0,'呵呵')
    print(stu2)
    通过下标访问列表中的元素,下标从0开始计数,也就是说,比如说一个列表,有个5元素,那么它第一个元素下标就是0,第二个就是1,以此类推,字符串也有下标,和列表一样 对列表的操作,分以下几种增、删、改、查
    增:

       msg = '你好'
                name = ['andashu','cc','niuniu']
                name.append(msg)#从最后面开始插入
                name.insert(1,msg) #从指定位置插入,这个1代表下标            
                print(name)

    改:

    查:

    删:

    #切片:列表取值的一种方式,可以指定范围取值:语法:【起始:结束:步长】

    # 切片,切片也就是另一种方式获取列表的值,它可以获取多个元素,可以理解为,从第几个元素开始,到第几个元素结束,获取他们之间的值,格式是name:[1:10],比如说要获取name的第一个元素到第五个元素,就可以用name[0:6],
    切片是不包含后面那个元素的值的,记住顾头不顾尾;前面的下标如果是0的话,前面可以省略不写,这样写,name[:6],切片后面还有可以写一个参数,叫做步长,也就是隔多少个元素,取一次,默认可以不写,也就是隔一个取一次,
    切片操作也可以对字符串使用,和列表的用法一样,实例如下:
    stu =[1,2,3,4,5,6,7,8,9]
    print(stu[2:6])
    print(stu[2:9:2])
    print(stu[::-3])#如果步长为负数时,从右往左取值
    print(stu[0:5])
    print(stu[:5])#如果最前面的下标没有写代表从最前面开始取
    print(stu[5:10])
    print(stu[5:])#如果最后面的下标没有写代表取到最后
    print(stu[:])#什么都没写代表从前取到尾
    new_stu = stu[:] #复制一个新的list
    new_stu = stu
    print(new_stu)
    #下标,索引,切片,同样适用于字符串,字符串也是可以循环的
    # 字符串一旦定义好就不能修改
    name = '马上要去吃饭了'
    print(name[2:])
    print(len(name))

    #循环字符串
    for a in range(len(name)):
    print('下标是:%s,字是:%s'%(a,name[a]))

    for a,b in enumerate(name):
    print('下标是:%s,文字是:%s'%(a,b))

    name[1]='去吃饭'#报错TypeError: 'str' object does not support item assignment(字符串一旦定义好就不能修改)
    # stus_info = [['杨静',18,'女','dddd'],['王志华',18,'女','dddd'],['王银梅',18,'女','dddd'],['周永波',18,'女','dddd']]#多维数组
    #
    # for stu in stus_info:
    # if stu[0]=='王志华':
    # print(stu)

    字典

    上面说了,整形、浮点型、字符串、列表和元组,下面说个新的数据类型,字典,字典也是我们开发过程中最常用的一种数据类型;想一个问题,现在要存整个北京市的所有人的信息,每个人有姓名、年龄、性别、家庭住址、学历等等,那要是用列表存的话,那就得定义N多个数组,然后存上每个人的信息,那累死人了。。。这时候又有一种新的数据类型出现了,那就是字典,dict,全称是dictionary,它具有极快的查找速度;字典是一种key-value的数据类型,比如说要存每个人的信息,那么每个人的编号就是key,value就是每个人的信息,这样的话,一个字典就能存所有人的信息了。字典的定义使用{},大括号,每个值用“,”隔开,key和value使用“:”分隔。
    举个列子,如果用列表存每个人的信息的话,需要用两个列表,一个存人名,一个存信息:

    
    
    

    给一个名字,如果要查他的对应信息,那就要先从names里面找到它的位置,然后再从infos中找到它的信息,如果这个列表越长,那么它的查询速度越慢。
    如果用字典实现的话,只需要一个名字和信息对应的一个表,这样就很快的根据名字找到它对应的信息,无论这个表有多大,查找速度都不会变慢。

    
    
    

    为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。
    第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢,这种就是字典的实现方式。
    字典的特性:
    字典是无序的,因为它没有下标,用key来当索引,所以是无序的
    字典的key必须是唯一的,因为它是通过key来进行索引的,所以key不能重复,天生就去重
    字典的增删改查:

    #定义空字典,字典是一种Key values形式的
    stu_info = {}
    stu_info = dict()
    #定义空字典:stu_info = dict() stu_info{}
    #字典一个逗号代表一个元素,字典比列表的速度快,字典里面的Key是不能重复的,如果有重复的,后面的那个会覆盖前面的那个
    # stu_info = {'name':'王志华','age':18,'addr':'北京'}
    # print(stu_info['name'])
    # res =list(range(1000000))
    # print(res)
    # list越慢去找list会越慢,但是字典不会,因为字典里面的里面key不能重复
    # josn是个字符想,想变成字典必须转换,josn只是格式长的像字典
    #字典查询方法:
    stu_info = {'name': '王志华', 'age': 18, 'addr': '北京'}
    print(stu_info)
    方法一:
    print(stu_info['name'])
    print(stu_info['age'])
    方法二:
    print(stu_info.get('name'))
    #用,get方法和【】的取值来看看如果key不存在的情况分别做如何处理:
    # print(stu_info['sex'])#[]取值时会报错:KeyError: 'sex'
    # print(stu_info.get('sex'))#不会报错:None,None代表什么都没有
    print(stu_info.get('sex','女'))#如果从系统里面get不到这个参数,就给他一个默认值
    #字典修改方法:修改只有下面一种方法
    stu_info = {'name': '王志华', 'age': 18, 'addr': '北京'}
    stu_info['addr']='上海'
    print(stu_info)

    #字典新增方法:
    stu_info = {'name': '王志华', 'age': 18, 'addr': '北京'}
    # 方法一:
    stu_info['zhiye']='测试'
    # 方法二:
    stu_info.setdefault('email','5852546@qq.com')

    #分别用上面两种新增方法新增已经存在的key:字典的key都是无序的
    # stu_info['name'] ='刘美燕'#不报错替换之前的value
    stu_info.setdefault('name','哈全哈')#不报错也不修改之前value的值
    print(stu_info)
    #字典删除方法:
    stu_info = {'name': '王志华', 'age': 18, 'addr': '北京'}
    # 方法一:
    stu_info.pop('addr')
    # 方法二:
    # stu_info.clear()#清空这个字典
    # 方法三:
    # stu_info.popitem()#从字典里面随机删除一个元素
    # 方法四:
    # del stu_info['addr']
    # 分别用方法一和方法四删除一个不存在的Key
    # stu_info.popitem('email')#报错:TypeError: popitem() takes no arguments (1 given)
    del stu_info['email']#报错:KeyError: 'email'
    print(stu_info)
    #关于字典的其他一些方法:
    d1={'b':'1'}
    d2={'a':'v'}
    d1.update(d2)#将d2的元素指定到d1里面
    print(d1)
    d1.keys()
    print(d1.keys())#key获取字典里面所有的key
    d1.values()
    print(d1.values())#values获取字典里所有的values
    #试一下直接循环字典,看看每次都循环的是:每次循环的是字典的key
    stu_info = {'name': '王志华', 'age': 18, 'addr': '北京'}
    for a in stu_info:
    print(a)
    #判断这个字典的Key是否存在:下面第一种方法更快
    # 方法一:
    print('name' in stu_info)
    # 方法二:
    print('name' in stu_info.keys())
    # 同时取到key和value的方法:下面两种方法第一种方法更快因为第二种会把字典里面的key和value变成一个二维数组
    # 方法一:
    for a in stu_info:
    # print('字典的key是:%s,字典的value是:%s'%(a,stu_info.get(a)))
    print('字典的key是:%s,字典的value是:%s'%(a,stu_info[a]))
    # 方法二:用.items方法可以同时取到key和value
    for a,b in stu_info.items():
    print('字典的key是:%s,字典的value是:%s'%(a,b))

    字典的内置方法:

    #字典多层嵌套字典
    # stu_info ={
    # '王志华':{'password':'w12345','phone':12233432123,'age':18,'addr':'北京'},
    # '王银梅':{'password':'w32123','phone':13333432123,'age':20,'addr':'上海'}
    # }
    # print(stu_info['王志华']['phone'])

    d = {
    '春波':{"car":['BMW','ben-a','五菱宏光'],"house":["北京",'南京','上海'], "money":1000000,},
    '乔美玲':{"bag":['xx','lv',],"house":['三环','4环'],"hzp":['skii','ysl']}
    }
    #春波买了一辆雪佛兰
    # d ['春波']['car'].insert(3,'雪佛兰')
    # print(d)
    #春波需要卖一套房
    # d['春波']['house'].pop(2)
    # d['春波']['house'].remove('上海')
    # print(d)
    #春波因为卖房钱增加500万
    # d['春波']['money']=d['春波']['money']+5000000
    # d['春波']['money']+= 5000000
    # print(d)


    f = {
    '春波':{ "car":{'BMW':5,'BENZ':3,'audi':3,'byd':4}, "house":["北京",'南京','上海'],"money":1000000,},
    '乔美玲':{"bag":['xx','lv',], "house":['三环','4环'],"hzp":['skii','ysl'],'language':{'普通话':10,'东北话':20,'日语':0,'英语':4}}
    }
    #乔美玲东北话降为10级
    # f['乔美玲']['language']['东北话'] =10
    # print(f)
    #看一下乔美玲会多少种语言
    # s = f['乔美玲']['language'].keys()
    # print(s)
    #春波总共有多少辆车
    # 方法一:
    # s =f['春波']['car'].values()
    # count =0
    # for d in s:
    # count = d+ count
    # print(count)
    # 方法二:
    # 用内置函数sum
    # s =f['春波']['car'].values()
    # print(sum(s))

    #自主完成:
    g = {
    '春波':{ "car":{'BMW':5,'BENZ':3,'audi':3,'byd':4}, "house":["北京",'南京','上海'],"money":1000000,},
    '乔美玲':{"bag":['xx','lv',], "house":['三环','4环'],"hzp":['skii','ysl'],'language':{'普通话':10,'东北话':20,'日语':0,'英语':4}}
    }

    #1、春波卖了一大上海的房子,卖了5000000:
    g['春波']['house'].remove('上海')
    g['春波']['money']+=5000000
    print(g)
    #2、春波有多少辆车:
    h =g['春波']['car'].values()
    print(sum(h))
    #3、春波买了一辆劳斯莱斯
    g['春波']['car'].setdefault('劳斯莱斯',1)
    print(g)
    #4、乔美玲东北话从20级变成10级
    g['乔美玲']['language']['东北话']=10
    print(g)
    #5、乔美玲会哪些语言:
    g['乔美玲']['language'].keys()
    print(g['乔美玲']['language'].keys())
    import getpass
    # s=' abc '
    # print(s.strip())#strip去空格
    # password.getpass.getpass()#getpass输入密码什么都看不见,pycharm不支持getpass

    #字符串常用方法
    s ='.abc.'
    # new_s =s.strip('.')#默认是去空格和换行符,也可以指定某个内容
    # print(s)
    # print(s.rstrip('.'))
    # print(s.lstrip('.'))
    # print(s.strip('.'))#strip默认去掉字符串两边的空格和换行符,字符串都是有返回值的,调用某个方法后,只会生成一个新的字符串,原来的字符串不改变
    # print(s.count('.'))#看某个元素出现的次数跟List是一样的
    print(s.index('a'))#找索引,找某个字符串的下标
    print(s.find('a'))#找索引,找某个字符串的下标
    #index和find的区别,如果字符串不存在时
    print(s.index('d'))#查找的字符串不存在时,会报错:ValueError: substring not found
    print(s.find('d'))#查找的字符串不存时不会报错:返回-1
    print(s.replace('a','A'))#替换字符串
    f ='.abc.,abc,abcd,abEde'
    print(f.replace('abc','ABC',3))#后面加个值代表里面有多个时,替换几个(从前往后数),如果不写就全部替换
    #下面两个可以在注册时候用到
    print(f.upper())#将里面的字母全部变成大写
    print(f.lower())#将里面的字母全部变成小写
    e ='abcdefg12汉'
    print(e.capitalize())#首字母大写
    print(e.startswith('a'))#判断是否以什么开头
    print(e.endswith('f'))#判断是否以什么结尾
    print(e.islower())#判断是否全部小写
    print(e.isupper())#判断是否全部大写
    print(e.istitle())#判断是否是个标题,首字母大写可能是个标题
    print(e.isdigit())#判断是否为纯数字
    print(e.center(50))#把字符串放在中间
    print(e.center(50,'*'))#把字符串放在中间,其它不够以什么来补齐
    print(e.isspace())#判断他是否是空格
    print(e.isalpha())#判断他是否都是字母或汉字,不能有数字和特殊字符
    print(e.isalnum())#字符串里面只要没有特殊字符就返回true
    print(e.isnumeric())#判断是否为数字
    print(e.isidentifier())#是否为合法的变量名,变量名不能以数字和特殊字符开头
    # h ='insert into user value (%s,%s,%s)'%('name','password','sex')#这种太多了不好弄,需要限定顺序
    # format方法:format是用大括号来占位的,不限定顺序
    l = 'insert into user value({name},{password},{addr},'
    '{email})'
    k=l.format(addr='上海',password=1345677,name='cuimeiping',email='9890@qq.com')
    print(k)
    J ={'addr':'北京','email':'20876701@qq.com','password':'c123','name':'cuimeiping'}
    # l.format_map()#可以传一个字典
    J =l.format_map(J)
    print(J)
    #把下面的数字变成01,02,03.。。
    P = [1,2,3,4,5,6,7,8,9,10,11,12]
    # for i in P:
    # if i>9:
    # print(i)
    # else:
    # res = '0' + str(i)
    # print(res)
    #字符串提供一个方法可以不用循环zfill
    U ='1'
    print(U.zfill(3))#3代表几位数,不够补0
    #有下面一批用户需要把它们单独插入到数据库,需要单独拿出user1,user2。。。
    R ='user1,user2,user3,user4,user5,user6,user7'
    #可以按,分割一下,分割成一个List,按照某个字符在分隔字符串,返回一个List
    print(R.split(','))
    print(R.split())#默认什么都不传时,按照一个空格来分隔字符串,多个空格也是一样分隔

    cars =['BMW','BEN-Z','BYD']
    res ='-'.join(cars)#以某个字符串把list里面元素连起来(把list的变成一个字符串)前面指定一个字符串,把list的里面的元素变成一个字符串
    print(res)
    print(str(cars))#直接把List转成字符串,但是会带【】,这样第一个元素变成【
    操作文件
    #操作文件
    #读文件:读文件时文件必须存在
    f =open('users.txt',encoding='utf-8')
    res = f.read()
    print(res)
    f.close()
    #写文件:w模式写文件的时候如果重新写会覆盖之前写的 a模式之前的东西还在
    # e = open('user1',mode='w',encoding='utf-8')
    # e.write('cuimeiping2,c890')
    # e.close()

    #a模式写之前的东西还在
    e = open('user1',mode='a',encoding='utf-8')
    e.write('cuimeiping3,c890 ')
    e.close()
    e =open('user1',encoding='utf-8')

    e =open('user1',encoding='utf-8')
    res = e.read()
    print(res)
    f.close()

    #练习
    1、写注册的程序:
    username:
    password:
    cpassword:
    册过的,两次密码必须输入一致
    账号、密码的长度要在6-10之间
    注册完成之后,存到文件里面

    2、登录,账号密码是从文件里面取的,如果输入的账号不存在要提示。
    登录的时候账号不区分大小写

    #先把文件的账号和密码放到list或字典里
    fw=open('a',encoding='utf-8')
    list= fw.read()
    fw.close()
    #分隔
    rest=list.split()#分隔
    print(rest)
    user_dict={}#定义一个空字典
    for i in rest:
    # name= i.split(',')[0]
    # password = i.split(',')[1]
    # print(name)
    # print(password)
    name,password=i.split(',')
    # print(name)
    # print(password)
    user_dict[name]=password
    print(user_dict)
    fr = open('a','a')
    # ----注册------
    for a in range(3):
    user_name=input('请输入用户名').strip().upper()
    user_password=input('请输入密码').strip()
    user_passcword=input('请输入确认密码').strip()
    if user_name==name:
    print('用户名已经存在')
    elif user_password !=user_passcword:
    print('两次密码不一致')
    elif len(user_name )not in range(6,11) or len(user_passcword) not in range(6,11):
    print('账号、密码的长度要在6-10之间')
    # elif user_name==''or user_passcword=='':
    # print('用户名密码不能为空')
    else:
    print('注册成功')
    user_dict[user_name]=user_passcword
    # g='%s,%s '%(user_name,user_passcword)
    fr.write('%s,%s '%(user_name,user_passcword))
    break
    else:
    print('输入次数过多')
    fr.close()
    #-----登录-----
    fl=open('a','a+',encoding='utf-8')
    fl.seek(0)
    res=fl.read()
    print(res)
    #要把文件内容分隔出来放到一个List里面
    res_list=res.split()
    print(res_list)
    dic ={}
    #
    for a in res_list:
    # if a.strip() !='':#判断是否为空行
    name,password=a.split(',')
    print(name)
    print(password)
    dic[name]=password
    print(dic)

    for i in range(3):
    res_name=input('请输入用户名').strip().lower()
    res_password=input('请输入密码').strip()
    if res_name==''or res_password=='':
    print('用户名密码不能为空')
    elif res_name not in dic:
    print('用户名不存在')
    elif res_password!=dic.get(res_name):
    print('密码不正确')
    else:
    print('登录成功')
    break
    else:
    print('输入次数过多')

  • 相关阅读:
    在Maven中怎么配置外部Jar
    eclipse+jetty+web项目调试---不显示源码
    Java中的BIO,NIO,AIO分别是什么
    Eclipse启动的时候提示:Failed to load JavaHL Library
    一个电脑安装两个jdk版本
    Archive for required library: 'D:/Program Files/Apache/maven-repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar'
    Sybase PowerDesigner 16.5注册码
    DI:Defect Index(缺陷率)
    使用jave2将音频wav转换成mp3格式
    java实现zip,gzip,7z,zlib格式的压缩打包
  • 原文地址:https://www.cnblogs.com/cuimeiping/p/9987026.html
Copyright © 2011-2022 走看看