列表
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:])
2.常用操作(追加、插入、修改、删除、查找、统计、清空)
names.append('lilei') #通过append可以追加,追加内容到列表的最后面
names.insert(1,'han×××') #可以通过insert插入到指定下标位置
print (names)
names[-1] = 'Perter' #根据下标来修改元素内容
names.remove('lisi') #直接删除列表中叫做lisi的元素
print (names)
del names[1] #删除下标为1的元素,可以看到han×××被删掉了
print (names)
names.pop() #pop删除l列表中的一个元素,并返回删除的值,默认括号不指定下标就是删除最后一个元素。
print (names)
print (names.index('wanger')) #index是索引,可以获取元素的下标
当前wagner这个元素在列表的第1下标的位置。
print (names[names.index('wanger')]) #该代码等同于print (names[1])
names = ['zhangsan','lisi','zhangsan']
print (names.count('zhangsan')) #统计names中有多少个zhagnsan这个元素
names.clear() #默认清空所有元素
print (names)
3.反转、排序
names = [1,5,2,6,3]
names.reverse() #使用reverse()反转
print (names)
names.sort() #使用sort()排序
print (names)
names = ['1aaa','!@#ajkw','abc','ABC'] #排序顺序:特殊符号--数字---大写---小写
names.sort()
print (names)
4.扩展(合并)、copy
name1 = [1,2,3,4]
name2 = [5,6,7,8]
name1.extend(name2)
#使用extend,将指定的变量(name2)中的元素合并(扩展)到当前变量中,被合并的变量依然存在。注意被扩展的变量(name2)如果被删除,那么name1就无法将其合并过来了。
print (name1)
name1 = [1,2,3,4]
name2 = name1.copy() #将指定变量(name1)的元素都copy过来
print (name2)
修改name1的元素
可以看到name2没有因为name1的修改而改变,name2根据定义的变量位置,从上到下取最近的name1来copy
可以看到name2 copy 了从上到下离自己最近的name1,元素是ccc;只copy一个name1的内容,这称作浅copy
如果用=来赋值的话,下面修改列表,那么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的第二层自列表也就跟着改了。
#列表第一层在内存中地址是不同的,所以不会受到影响。
- 调用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)
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)
可以看到执行结果,深copy并不会因为name1的修改而改变。
6.打印步长列表
a =[1,2,3,4,5,6,7,8,9,10]
print (a[0:-1:2])
print (a[::2])
7.copy的补充
浅copy的方式有三种
import copy
person=['name',['money',100]]
#下面是三种浅copy的方式,效果是一样的
p1=copy.copy(person) #引用
p2=person[:]
p3=list(person) #工程函数
其实浅copy是有用途的,比如使用共同账号
print(p1)
print(p2)
当前值都是相同的
我们假设夫妻两个人,有共同的银行卡号,里面有100块钱
p1[0]='lilei'
p2[0]='han×××'
print(p1)
print(p2)
可以看到浅copy只copy了一层,可以看到当前的钱数都是100
p1[1][1]=50 #lilei从该账户取出50块钱,因为是共享账户,所以此时han×××的账户应该也只有50块钱
print(p1)
print(p2)
a = [['Iphone', '5800'], ['Computer', '9800'], ['Watch', '8000']]
print (a[2][1])
通过打印第2坐标的第1个元素(前面有个0),是8000
print (a[:][1])
本意打算用这个打印命令能够将0、1、2三个子列表的1下标元素给打印出来;但实际要达到这种效果必须要通过循环来操作。
print 只能打印一次
但凡是取所有值,只能用循环(比如for循环)
小结:
用 = 赋值,原有的变量被修改,新的变量也会被修改。
用浅copy,原有的变量被修改,第一层元素不会被修改,深层的元素会被修改。
用深copy,原有的变量无论是第一层还是深层的元素被修改,新的变量都不会被修改。
元组
元组又叫做只读列表,元组是不可变类型,只能读和查找
元组只有两个方法count和index
names =('lilei','han×××')
定义产品和价钱列表
定义一个购物车,当前为空
需要判断用户输入的是不是一个数字的字符串,如果是就将该字符串转换成整数类型
isgigit用来判断是否是数字
可以看到当前实现了输入工资、定义产品编号、商品和价格
下面是一个优化的代码
图中的break只是为了暂时测试用,下面会删掉。
enumerate会将循环的列表下标给取出,然后赋值给index;
而循环括号中的product_list的所有元组内容会赋值给item
可以看到执行效果是一样的。
以下是购物车程序的完整代码----------------------------------
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 ('工资输入错误,退出......')