常见的数据类型
列表
在python中,列表的创建可以是由[]两个方括号组成的。在其他语言中,被称之为数组。
列表里可以存放一组值,并且系统默认的给列表里的每一个元素以索引值,方便查找和使用。
如下:
#创建一个列表,并且保存一定的数据 user_list = [‘刘德华‘,‘张学友‘,‘张靓颖‘,‘郭富城‘,‘李白‘] print(user_list) #[‘刘德华‘, ‘张学友‘, ‘张靓颖‘, ‘郭富城‘, ‘李白‘] #根据索引值来读取数据 print(user_list[0])#刘德华
我们在实际的应用中,可以非常方便的通过索引值来取出自己想要的值。
此时,如果需要在列表中取出多个连续的值,可以采用下面的写法:
1 #创建存储了多个值得列表 2 3 start_list = [‘刘德华‘,‘张学友‘,‘张靓颖‘,‘郭富城‘,‘李白‘] 4 5 #此时,需要取出 张学友到郭富城 6 s_list = start_list[1:4] 7 8 print(s_list) # [‘张学友‘, ‘张靓颖‘, ‘郭富城‘]
在上面的代码中,在取值的时候,我们使用了1:4,索引值从张学友的1到李白的4,但是李白却没有被选取到,此时的原则是顾头不顾尾
而这样的一种操作,我们称之为切片
Tip:在进行切片 操作后,并不会改变原本的数组。
那么从左边开始取值,索引值从0开始,如果从右边开始取值,索引值从-1开始。
如果需要从右向左取值,有一点需要注意,例如:
#创建存储了多个值得列表 start_list = [‘刘德华‘,‘张学友‘,‘张靓颖‘,‘郭富城‘,‘李白‘]
想要取值从右向左李白到张靓颖,写法如下:
n_list = start_list[-3:] print(n_list)
从右向左,李白是-1 ,那么将-1省略,要取值到张靓颖,那么张靓颖的索引为-3,那么就写成[-3:] 。
同理,如果从左向右取值,前面如果是0,也是可以省略的。
追加
如果我们需要给列表里面追加一些元素,可以使用append方法,向列表的最后追加一些元素。
#创建一个列表 user_list = [‘宋小宝‘,‘赵四‘,‘刘能‘,‘小沈阳‘] #向列表中追加元素 user_list.append(‘赵本山‘) #检测原列表是否被改变 print(user_list)
输出的结果:
[‘宋小宝‘, ‘赵四‘, ‘刘能‘, ‘小沈阳‘, ‘赵本山‘]
新追加的内容已经被追加到列表的最后。
如果需要将某个元素插入到某个元素之前,可以使用insert方法。
如下:
user_list = [‘宋小宝‘,‘赵四‘,‘刘能‘,‘小沈阳‘] #将添加的内容添加到赵四的前面 user_list.insert(1,‘赵本山‘) print(user_list)
结果如下:
[‘宋小宝‘, ‘赵本山‘, ‘赵四‘, ‘刘能‘, ‘小沈阳‘]
新的数据已经添加成功。
改
如果需要修改列表中的某一项,可以直接通过索引值找到元素并且直接赋予新值即可。
如下:
user_list[0] = ‘二人转‘
删除
如果需要删除列表中的元素,可以采用remove ,del 或者pop方式。
remove方法:
#创建一个列表 user_list = [‘测试1‘,‘测试2‘,‘测试3‘,‘测试4‘] #使用remove方式删除元素 user_list.remove(‘测试1‘) print(user_list)
del方法:
#创建一个列表 user_list = [‘测试1‘,‘测试2‘,‘测试3‘,‘测试4‘] #使用del 方法删除 del user_list[1] print(user_list)
pop方法:
#创建一个列表 user_list = [‘测试1‘,‘测试2‘,‘测试3‘,‘测试4‘] #使用pop方法删除 user_list.pop() print(user_list)
Tip:上面的pop方法此时没有传递参数,会默认的把列表中最后一个值删除,当然,pop()方法中同样接受传入参数[列表的索引值],所以一旦pop传入了索引值,那么它的功能效果就等同于del方法。
总结
增
使用append方法,insert方法
删除
使用remove ,del以及pop方法
改
直接使用索引值找到元素并且赋予新值
查
通过索引值的方式可以查询数据
我们也可以通过index方法来查询某个元素的在列表中的索引值。
如下:
#创建列表 user_list = [‘测试1‘,‘测试2‘,‘测试3‘] index_user = user_list.index(‘测试2‘) print(index_user) # 1
在列表中,如果想要查看某个元素出现的次数,可以使用count方法
如下:
#创建列表 user_list = [‘测试1‘,‘测试2‘,‘测试3‘,‘测试2‘,‘测试3‘] # 使用count方法统计一个元素在列表中出现的次数 num = user_list.count(‘测试2‘) print(num) # 2 表示测试2 出现了两次
清空列表
python中清空列表可以使用clear方法
如下:
#创建列表 user_list = [‘测试1‘,‘测试2‘,‘测试3‘,‘测试2‘,‘测试3‘] #使用clear方法清空列表 user_list.clear(); #检查列表是否被清空 print(user_list) #显示为[] ,说明列表已经被成功清空了
反转列表
python中反转列表使用reverse方法
如下:
#创建列表 user_list = [‘测试1‘,‘测试2‘,‘测试3‘,‘测试2‘,‘测试3‘] #使用reverse方法反转列表 user_list.reverse() print(user_list)
排序
python中列表的排序可以使用sort方法
如下:
#创建列表 list = [‘2Ceshi2‘,‘#Ceshi1‘,‘ACeshi3‘,‘aCeshi4‘] list.sort() print(list)
结果如下:
[‘#Ceshi1‘, ‘2Ceshi2‘, ‘ACeshi3‘, ‘aCeshi4‘]
那么排序的顺序其实是按照ASCII码的顺序进行排序。
合并列表
python中列表可以进行合并,使用extend方法
如下:
#创建列表 list = [‘2Ceshi2‘,‘#Ceshi1‘,‘ACeshi3‘,‘aCeshi4‘] #创建第二个列表 test_list = [1,2,3,4] #将第二个列表合并到list列表中 list.extend(test_list) print(list,test_list)
上述代码中,test_list 顺利的被合并到list中,而原本的test_list列表依然存在。
删除整个列表
如下:
del 列表的名字
复制
python中,实现列表的复制,可以使用copy方法,而copy方法分为深层复制和浅层复制。
先来看下浅层复制:
1 ‘‘‘ 2 copy()方法 复制 3 4 浅层复制 5 6 列表中还可以存在列表,也可以存在其他的数据类型,而浅层复制指的是仅复制第一层,而第二层列表 7 中的内容仅复制指向内存地址的指针 8 ‘‘‘ 9 10 # 创建一个列表 11 test_list = [‘alex‘,‘LiBai‘,‘Zhangxueyou‘,‘Zhaosi‘] 12 13 test2 = test_list.copy() 14 15 print(test2) #[‘alex‘, ‘LiBai‘, ‘Zhangxueyou‘, ‘Zhaosi‘] 16 17 # 更改第一层列表中的某个元素值 18 test_list[0] = ‘hello,world‘ 19 20 # 检查是否更改成功 21 print(test_list) # 成功 22 23 #检查test2是否更改第一个元素 24 print(test2) # 第二个列表没有更改
此时在上面的代码中,列表test_list第一个值进行了更改,而test2列表复制过来的第一个值则没有更改。
如果列表test_list中还存在一个列表,在浅层复制的情况下,会出现如下的情况:
# 创建一个列表 - 并且列表中存在二级的列表 test_list = [‘alex‘,‘LiBai‘,‘Zhangxueyou‘,‘Zhaosi‘,[‘Nihao‘,‘yanyan‘]] test2 = test_list.copy() # 第一个列表已经全部被复制了过来 # 更改第一个列表中子集列表的值 test_list[4][0] = [‘NIHAO‘] # 查看test2列表是否更改 print(test2)
发现此时test2列表已经更改:
[‘alex‘, ‘LiBai‘, ‘Zhangxueyou‘, ‘Zhaosi‘, [[‘NIHAO‘], ‘yanyan‘]]
原因是此时的复制是浅层复制,只复制到了第一层,第二层里面的列表并没有进行复制,只是复制了一个指向内存方向的指针。
深层复制需要引入copy模块
代码如下:
import copy # 创建列表 list_user = [‘alex‘,‘libai‘,‘zhaobenshan‘,[‘yanyan‘,‘yuping‘]] # 进行深层复制 new_list = copy.deepcopy(list_user) #print(new_list) # 复制成功 # 更改第一组列表 list_user[3][0] = "YANYAN" print(list_user) print(new_list)
通过引入copy模块,并且使用deepcopy方法即可实现深层复制
循环列表
列表的循环使用for..in 即可。
代码如下:
# 创建列表 test_list = [‘alex‘,‘libai‘,‘shaopengtao‘,‘wangmengchan‘] for i in test_list: print(i) # 循环成功
补充:代码切片
我们在打印列表的时候,可以使用切片的方式,例如
test_list = [‘alex‘,‘libai‘,‘shaopengtao‘,‘wangmengchan‘]
有这样的一个列表,然后现在想将列表0到-1的位置进行切片,
print(0:-1)
那么此时如果想要在切片的基础上进行每两个选取一个,代码可以写成如下:
print(0:-1:2)
那么最终实现的效果如下:
[‘alex‘, ‘shaopengtao‘]
那么在切片的过程中,如果开始或者结束的位置是0或者-1是可以被省略的,所以上面的代码就变成了如下:
print(::2)
结果同样是不变的。
知识点补充和总结:
上面我们说到,浅层复制的使用,其实在实际应用的情景下大概有三种方式可以实现浅层复制,例如下面的演示代码,将演示三种浅层复制的情况:
1 import copy 2 # 创建列表 3 test_list = [‘name‘,[‘deposit‘,100]] 4 5 ‘‘‘ 6 实现浅层复制的三种写法: 7 8 copy方法 9 [:] 10 list 11 ‘‘‘ 12 ‘‘‘ 13 # 第一种方式,使用copy.copy 14 new_list = copy.copy(test_list) 15 print(new_list) 16 ‘‘‘ 17 ‘‘‘ 18 #第二种方式 19 new_list = test_list[:] 20 print(new_list) 21 ‘‘‘ 22 23 #第三种方式 24 new_list = list(test_list) 25 print(new_list)
浅层复制的应用
例如,夫妻之间有一个共同的银行账户,里面有着共同的财产,其中一个人取钱或者存钱,那么另一放的余额显示肯定是要更改的。
代码如下:
# 创建列表,演示夫妻共用一个银行账户的需求 money = [‘name‘,[‘deposit‘,2000]] # 创建两个不同的人 libai = money[:] yanyan = money[:] #此时当丈夫libai 取了1000块 libai[0] = ‘LiBai‘ libai[1][1] = 2000 - 1000 yanyan[0] = ‘Yanyan‘ # 此时无论是丈夫libai还是妻子yanyan的银行存款余额都会变少,因为二人共用一个账户 print(libai) print(yanyan)
说的简单点,就是通过浅层复制来实现共享账号,当然,上面的应用只是简单的举个例子,在实际中,银行也不会将数据存储在列表中。
元组(tuple)
元组其实类似于列表,也就是存一组数,只不过它一旦创建,便不能再次修改,所以又叫做只读列表。
元组本身只能切片和查询但是不能够更改。
代码如下:
names = (‘Alex‘,‘Libai‘,‘Jack‘)
在元组这个对象里面,只有两个方法,一个是count,一个是index。
小练习:购物车
需求:
代码如下:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # Author:Li Bai 4 5 # 创建列表 6 product_list = [ 7 (‘Iphone‘,5800), 8 (‘Mac Pro‘,9800), 9 (‘Bike‘,800), 10 (‘Watch‘,10600), 11 (‘Coffee‘,31), 12 ] 13 14 # 创建一个空列表,用来存储用户购买的商品 15 shopping_list = [] 16 17 salary = input(‘Input your Salary:‘) 18 # 判断用户输入的是否是数字 19 if salary.isdigit(): 20 # 将用户输入的转换为int整型 21 salary = int(salary) 22 # 循环输出列表 23 while True: 24 # 输出商品列表中的内容和索引值 25 for index,item in enumerate(product_list): 26 # 输出 27 print(index,item) 28 user_choice = input(‘你好,请输入购买的商品序号:‘) 29 # 判断用户输入的是否为序号数字 30 if user_choice.isdigit(): 31 user_choice = int(user_choice) 32 # 判断用户输入的商品序号是否是合理的 33 if user_choice < len(product_list) and user_choice >= 0: 34 print(user_choice) 35 p_item = product_list[user_choice] 36 # 判断用户的财产是否足够 37 if p_item[1] <= salary: # 买的起 38 shopping_list.append(p_item) # 将用户选取的商品存进shopp_list列表 39 salary -=p_item[1] # 将财产减去购买的商品列表 40 # 打印财产余额 41 print("Add %s into shopping cart ,your current balance is %s" %(p_item,salary)) 42 else : 43 print(‘你的余额只剩%s,余额不足‘% salary) 44 else : 45 print("product code [%s] is not exist!"% user_choice) 46 elif user_choice == ‘q‘: 47 print("--------shopping list------") 48 for p in shopping_list: 49 print(p) 50 print("Your current balance:",salary) 51 exit() 52 else: 53 print("invalid option")