前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python07 列表、元组

Python07 列表、元组

作者头像
py3study
发布2020-01-08 16:03:59
5530
发布2020-01-08 16:03:59
举报
文章被收录于专栏:python3python3python3

列表

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
image_1c08dk07ieaa4pqt8the0165n9.png-6.2kB

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

names.append('lilei')        #通过append可以追加,追加内容到列表的最后面
names.insert(1,'han×××')        #可以通过insert插入到指定下标位置
print (names)
image_1c08dlvh5t3tjb6hevmsbqnim.png-2.3kB
image_1c08dlvh5t3tjb6hevmsbqnim.png-2.3kB
 names[-1] = 'Perter'        #根据下标来修改元素内容 
image_1c08dmlh0bl31l8a16cd2d037v13.png-2.5kB
image_1c08dmlh0bl31l8a16cd2d037v13.png-2.5kB
names.remove('lisi')        #直接删除列表中叫做lisi的元素
print (names) 
image_1c08dpip21o6sb9s5d5tqnne31g.png-2.4kB
image_1c08dpip21o6sb9s5d5tqnne31g.png-2.4kB
del names[1]        #删除下标为1的元素,可以看到han×××被删掉了
print (names)
image_1c08dso2uufkguavip1cn4m5p1t.png-2kB
image_1c08dso2uufkguavip1cn4m5p1t.png-2kB
names.pop()        #pop删除l列表中的一个元素,并返回删除的值,默认括号不指定下标就是删除最后一个元素。
print (names)
print (names.index('wanger'))        #index是索引,可以获取元素的下标
image_1c08duil4100se6b33p10ct1qah2a.png-1.9kB
image_1c08duil4100se6b33p10ct1qah2a.png-1.9kB

当前wagner这个元素在列表的第1下标的位置。

print (names[names.index('wanger')])        #该代码等同于print (names[1])
image_1c08dvlgng0m19ep1sac1qll1o4l2n.png-1kB
image_1c08dvlgng0m19ep1sac1qll1o4l2n.png-1kB
names = ['zhangsan','lisi','zhangsan']
print (names.count('zhangsan'))            #统计names中有多少个zhagnsan这个元素
image_1c08e0bhl1hr61qc6cjfhfgbe34.png-0.3kB
image_1c08e0bhl1hr61qc6cjfhfgbe34.png-0.3kB
names.clear()        #默认清空所有元素
print (names)
image_1c08e0smipt01got9r61s21k5i3h.png-0.2kB
image_1c08e0smipt01got9r61s21k5i3h.png-0.2kB

3.反转、排序

names = [1,5,2,6,3]
names.reverse()            #使用reverse()反转
print (names)
image_1c08e29i787n1dhgsdgshcv4t3u.png-1.3kB
image_1c08e29i787n1dhgsdgshcv4t3u.png-1.3kB
names.sort()                #使用sort()排序
print (names)
image_1c08e4mbk1qi51rsdrni897pv5o.png-1.2kB
image_1c08e4mbk1qi51rsdrni897pv5o.png-1.2kB
names = ['1aaa','!@#ajkw','abc','ABC']            #排序顺序:特殊符号--数字---大写---小写
names.sort()
print (names)
image_1c08e2sc7be91garih01jnhb2v4b.png-2.6kB
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
image_1c08e69jd1bjo1ltv7gh1j58bn265.png-1.9kB
name1 = [1,2,3,4]
name2 = name1.copy()            #将指定变量(name1)的元素都copy过来
print (name2)
image_1c08e7jo01dj19ob1un6vv1dko6i.png-0.9kB
image_1c08e7jo01dj19ob1un6vv1dko6i.png-0.9kB

image_1c08e88tg1ih211k61rstjn63606v.png-9.1kB
image_1c08e88tg1ih211k61rstjn63606v.png-9.1kB

修改name1的元素

image_1c08e8l0e1lge1fa8m1as1lr7c.png-1.7kB
image_1c08e8l0e1lge1fa8m1as1lr7c.png-1.7kB

可以看到name2没有因为name1的修改而改变,name2根据定义的变量位置,从上到下取最近的name1来copy


image_1c08e99e61h63f91cee1656sh7p.png-7.8kB
image_1c08e99e61h63f91cee1656sh7p.png-7.8kB
image_1c08e9fl91em31t7e1j0i9cc18ic86.png-0.5kB
image_1c08e9fl91em31t7e1j0i9cc18ic86.png-0.5kB

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


image_1c08e9vp316ns1v8qjht14eo1k2m8j.png-4.7kB
image_1c08e9vp316ns1v8qjht14eo1k2m8j.png-4.7kB
image_1c08ealhjdeogoe1ua1e6e8n9g.png-1.5kB
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
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
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
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
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
image_1c08em8uc17opr5i13209uk10gsc1.png-1.9kB

当前值都是相同的

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

p1[0]='lilei'
p2[0]='han×××'

print(p1)
print(p2)
image_1c08endocfs51eoc1voe1pf6ebdce.png-2.4kB
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
image_1c08eo2s98ks1htnaklg7n1hi6cr.png-2.6kB
a = [['Iphone', '5800'], ['Computer', '9800'], ['Watch', '8000']]
print (a[2][1])
image_1c08eojma1phhuepdo01gs51dlkd8.png-0.6kB
image_1c08eojma1phhuepdo01gs51dlkd8.png-0.6kB

通过打印第2坐标的第1个元素(前面有个0),是8000

print (a[:][1])  
image_1c08eq3981g7o733ud0k7t71cdl.png-2kB
image_1c08eq3981g7o733ud0k7t71cdl.png-2kB

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

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


小结:

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

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

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

元组

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

元组只有两个方法count和index

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


image_1c08es3ujcqapcdfli1e3b1lt7e2.png-85.2kB
image_1c08es3ujcqapcdfli1e3b1lt7e2.png-85.2kB
image_1c08esec016efe091d1elcr18kpef.png-11.4kB
image_1c08esec016efe091d1elcr18kpef.png-11.4kB

定义产品和价钱列表

image_1c08esop9vg793m4b01ga71gdmes.png-1.7kB
image_1c08esop9vg793m4b01ga71gdmes.png-1.7kB

定义一个购物车,当前为空

image_1c08eta753r6107f11aduciafp.png-17.3kB
image_1c08eta753r6107f11aduciafp.png-17.3kB

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

isgigit用来判断是否是数字

image_1c08etq6vguq1r63pn1ghu1javg6.png-7.7kB
image_1c08etq6vguq1r63pn1ghu1javg6.png-7.7kB

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

下面是一个优化的代码

image_1c08ev18c1peihnnhqr1p8dkt4gj.png-17.3kB
image_1c08ev18c1peihnnhqr1p8dkt4gj.png-17.3kB

图中的break只是为了暂时测试用,下面会删掉。 enumerate会将循环的列表下标给取出,然后赋值给index;

而循环括号中的product_list的所有元组内容会赋值给item

image_1c08evcok195v8pa1hau1kjt73gh0.png-8.6kB
image_1c08evcok195v8pa1hau1kjt73gh0.png-8.6kB

可以看到执行效果是一样的。


以下是购物车程序的完整代码----------------------------------

image_1c08f0gko1eii1j271ahh1dfug5hd.png-23.1kB
image_1c08f0gko1eii1j271ahh1dfug5hd.png-23.1kB
image_1c08f0l5110781tlfgom6qiethhq.png-116.4kB
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 ('工资输入错误,退出......')
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 列表
    • 1.赋值与取值
      • 2.常用操作(追加、插入、修改、删除、查找、统计、清空)
        • 3.反转、排序
          • 4.扩展(合并)、copy
            • 5.嵌套列表
              • 6.打印步长列表
                • 7.copy的补充
                • 元组
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档