Python07 列表、元组

2023-01-31 05:01:39 列表 Python07

列表

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 ('工资输入错误,退出......')

相关文章