Python07 列表、元组

发布时间:2019-09-08 09:10:54编辑:auto阅读(1518)

    列表

    1.赋值与取值

    names = ['zhangsan','lisi','wanger']
    
    print (names[0])        #0表示从左数第一个值
    print (names[-1])        #-1表示最后一个值
    print (names[0:3])        #:符号用来表示范围,列表中只有三个元素,正常应该写0:2,但是通过切片取值时,实际最后一个数字不计算,也就是说0:3相当于0:2。
    
    print (names[:3])        #冒号前面不写数字就表示从0开始
    print (names[0:])        #0:后面不跟数字的话,表示从左边第一个到最后一个元素
    print (names[-3:-1])    #元素下标也可以用复数表示,最后一个用-1表示,倒数第二个用-2表示以此类推。
    print (names[-3:])

    image_1c08dk07ieaa4pqt8the0165n9.png-6.2kB

    2.常用操作(追加、插入、修改、删除、查找、统计、清空)

    names.append('lilei')        #通过append可以追加,追加内容到列表的最后面
    names.insert(1,'han×××')        #可以通过insert插入到指定下标位置
    print (names)

    image_1c08dlvh5t3tjb6hevmsbqnim.png-2.3kB

     names[-1] = 'Perter'        #根据下标来修改元素内容 

    image_1c08dmlh0bl31l8a16cd2d037v13.png-2.5kB

    names.remove('lisi')        #直接删除列表中叫做lisi的元素
    print (names) 

    image_1c08dpip21o6sb9s5d5tqnne31g.png-2.4kB

    del names[1]        #删除下标为1的元素,可以看到han×××被删掉了
    print (names)

    image_1c08dso2uufkguavip1cn4m5p1t.png-2kB

    names.pop()        #pop删除l列表中的一个元素,并返回删除的值,默认括号不指定下标就是删除最后一个元素。
    print (names)
    print (names.index('wanger'))        #index是索引,可以获取元素的下标

    image_1c08duil4100se6b33p10ct1qah2a.png-1.9kB
    当前wagner这个元素在列表的第1下标的位置。

    print (names[names.index('wanger')])        #该代码等同于print (names[1])

    image_1c08dvlgng0m19ep1sac1qll1o4l2n.png-1kB

    names = ['zhangsan','lisi','zhangsan']
    print (names.count('zhangsan'))            #统计names中有多少个zhagnsan这个元素

    image_1c08e0bhl1hr61qc6cjfhfgbe34.png-0.3kB

    names.clear()        #默认清空所有元素
    print (names)

    image_1c08e0smipt01got9r61s21k5i3h.png-0.2kB

    3.反转、排序

    names = [1,5,2,6,3]
    names.reverse()            #使用reverse()反转
    print (names)

    image_1c08e29i787n1dhgsdgshcv4t3u.png-1.3kB

    names.sort()                #使用sort()排序
    print (names)

    image_1c08e4mbk1qi51rsdrni897pv5o.png-1.2kB

    names = ['1aaa','!@#ajkw','abc','ABC']            #排序顺序:特殊符号--数字---大写---小写
    names.sort()
    print (names)

    image_1c08e2sc7be91garih01jnhb2v4b.png-2.6kB

    4.扩展(合并)、copy

    name1 = [1,2,3,4]
    name2 = [5,6,7,8]
    name1.extend(name2)            
    
    #使用extend,将指定的变量(name2)中的元素合并(扩展)到当前变量中,被合并的变量依然存在。注意被扩展的变量(name2)如果被删除,那么name1就无法将其合并过来了。
    
    print (name1)

    image_1c08e69jd1bjo1ltv7gh1j58bn265.png-1.9kB

    name1 = [1,2,3,4]
    name2 = name1.copy()            #将指定变量(name1)的元素都copy过来
    print (name2)

    image_1c08e7jo01dj19ob1un6vv1dko6i.png-0.9kB


    image_1c08e88tg1ih211k61rstjn63606v.png-9.1kB
    修改name1的元素
    image_1c08e8l0e1lge1fa8m1as1lr7c.png-1.7kB
    可以看到name2没有因为name1的修改而改变,name2根据定义的变量位置,从上到下取最近的name1来copy


    image_1c08e99e61h63f91cee1656sh7p.png-7.8kB
    image_1c08e9fl91em31t7e1j0i9cc18ic86.png-0.5kB
    可以看到name2 copy 了从上到下离自己最近的name1,元素是ccc;只copy一个name1的内容,这称作浅copy


    image_1c08e9vp316ns1v8qjht14eo1k2m8j.png-4.7kB

    image_1c08ealhjdeogoe1ua1e6e8n9g.png-1.5kB
    如果用=来赋值的话,下面修改列表,那么name2也是会改变的。

    5.嵌套列表

    name1=[1,2,3,['zzz']]        
    print (name1)                    #第一个name1
    
    name2=name1.copy()        #name2与name1相同
    print (name2)
    
    name1[1]='abc'            
    name1[3][0]='xxx'        
    print(name1)                    #第二个name1,可以看到name1已经修改了
    print (name2)                   
    
         #这里name2奇怪的是,下标1copy的是第一个name1,而嵌套的子列表copy的确是第二个name1子列表中的元素, 这是因为name2正常会copy第一层列表的元素,但是第二层自列表的元素在内存中地址是相同的,所以当name1第二层的自列表元素被改了,name2的第二层自列表也就跟着改了。
    
        #列表第一层在内存中地址是不同的,所以不会受到影响。

    image_1c08ed9eq2d02fm13iq1ib9q269t.png-3.2kB


    • 调用copy模块
      import copy
      name1=[1,2,3,['zzz']]
      print (name1)
      name2=copy.copy(name1)            #这行代码等于name2=name1.copy(),结果是一样的
      print (name2)
      name1[1]='abc'
      name1[3][0]='xxx'
      print(name1)
      print (name2)

      image_1c08egki71tq91esp1v1j1ifk1h1paa.png-2.8kB


    import copy
    
    name1=[1,2,3,['zzz']]
    print (name1)
    name2=copy.deepcopy(name1)            #使用deepcopy就是深copy
    print (name2)
    name1[1]='abc'
    name1[3][0]='xxx'
    print(name1)
    print (name2)

    image_1c08ei1bijl1i5v14dj1pqqspean.png-3.3kB
    可以看到执行结果,深copy并不会因为name1的修改而改变。

    6.打印步长列表

    a =[1,2,3,4,5,6,7,8,9,10]
    print (a[0:-1:2])
    print (a[::2])

    image_1c08ej1digo91hls9d73jf160db4.png-1.3kB

    7.copy的补充

    浅copy的方式有三种

    
    import copy
    
    person=['name',['money',100]]
    
    #下面是三种浅copy的方式,效果是一样的
    p1=copy.copy(person)    #引用
    p2=person[:]
    p3=list(person)     #工程函数
    
    其实浅copy是有用途的,比如使用共同账号
    
    print(p1)
    print(p2)
    

    image_1c08em8uc17opr5i13209uk10gsc1.png-1.9kB
    当前值都是相同的

    我们假设夫妻两个人,有共同的银行卡号,里面有100块钱

    p1[0]='lilei'
    p2[0]='han×××'
    
    print(p1)
    print(p2)

    image_1c08endocfs51eoc1voe1pf6ebdce.png-2.4kB
    可以看到浅copy只copy了一层,可以看到当前的钱数都是100

    p1[1][1]=50        #lilei从该账户取出50块钱,因为是共享账户,所以此时han×××的账户应该也只有50块钱
    
    print(p1)
    print(p2)

    image_1c08eo2s98ks1htnaklg7n1hi6cr.png-2.6kB

    a = [['Iphone', '5800'], ['Computer', '9800'], ['Watch', '8000']]
    print (a[2][1])

    image_1c08eojma1phhuepdo01gs51dlkd8.png-0.6kB
    通过打印第2坐标的第1个元素(前面有个0),是8000

    print (a[:][1])  

    image_1c08eq3981g7o733ud0k7t71cdl.png-2kB
    本意打算用这个打印命令能够将0、1、2三个子列表的1下标元素给打印出来;但实际要达到这种效果必须要通过循环来操作。

    print 只能打印一次
    但凡是取所有值,只能用循环(比如for循环)


    小结:

    用 = 赋值,原有的变量被修改,新的变量也会被修改。

    用浅copy,原有的变量被修改,第一层元素不会被修改,深层的元素会被修改。

    用深copy,原有的变量无论是第一层还是深层的元素被修改,新的变量都不会被修改。

    元组

    元组又叫做只读列表,元组是不可变类型,只能读和查找

    元组只有两个方法count和index

    names =('lilei','han×××')


    image_1c08es3ujcqapcdfli1e3b1lt7e2.png-85.2kB

    image_1c08esec016efe091d1elcr18kpef.png-11.4kB
    定义产品和价钱列表

    image_1c08esop9vg793m4b01ga71gdmes.png-1.7kB
    定义一个购物车,当前为空

    image_1c08eta753r6107f11aduciafp.png-17.3kB
    需要判断用户输入的是不是一个数字的字符串,如果是就将该字符串转换成整数类型

    isgigit用来判断是否是数字

    image_1c08etq6vguq1r63pn1ghu1javg6.png-7.7kB
    可以看到当前实现了输入工资、定义产品编号、商品和价格

    下面是一个优化的代码
    image_1c08ev18c1peihnnhqr1p8dkt4gj.png-17.3kB
    图中的break只是为了暂时测试用,下面会删掉。
    enumerate会将循环的列表下标给取出,然后赋值给index;

    而循环括号中的product_list的所有元组内容会赋值给item
    image_1c08evcok195v8pa1hau1kjt73gh0.png-8.6kB
    可以看到执行效果是一样的。


    以下是购物车程序的完整代码----------------------------------
    image_1c08f0gko1eii1j271ahh1dfug5hd.png-23.1kB

    image_1c08f0l5110781tlfgom6qiethhq.png-116.4kB

    product_list = [
        ('Iphone',5800),
        ('Mac Pro',9800),
        ('Bike',800),
        ('Watch',10600),
        ('Coffee',31),
        ('Book',120),
    ]
    
    shopping_list = []
    
    salary = input('your salary:')
    
    if salary.isdigit():
        salary = int(salary)
        while True:
            for index,item in enumerate(product_list):
                print (index,item)
            user_choice = input('选择商品编码或选择q退出:')
            if user_choice.isdigit():
                user_choice = int(user_choice)
                if user_choice < len(product_list) and user_choice >=0:
                    p_item = product_list[user_choice]
                    if p_item[1] <= salary:
                        shopping_list.append(p_item)
                        salary -= p_item[1]
                        print ('Added %s into shopping cart, you current balance is \33[31;1m%s\033[0m' %(p_item,salary))
                    else:
                        print ('033[41;1m你的余额不足,只剩[%s]元\033[0m' %salary)
                else:
                    print ('product code [%s] is not exist')
            elif user_choice =='q':
                print ('---shoping list---')
                for p in shopping_list:
                    print ('你购买的商品:',p)
                print ('你的余额为:',salary)
                exit()
            else:
                print ('Invalid option')
    else:
        print ('工资输入错误,退出......')
    

关键字